iOS有多种数据持久化得方式

  • plist文件(属性列表)

  • preference(偏好设置,NSUserDefaults)

  • NSKeyedArchiver(归档,用的不多)

  • SQLite 3 (需要导入库libsqlite3.0.tbd,并且在使用时要包含<sqlite3.h>头文件)

  • CoreData (IOS5后出的框架,能帮助我们不写SQL语句将数据保存在SQLite数据库文件中,并对数据进行管理)

1.新建一个工程

(1)先不勾选Xcode为我们提供的Use Core Data,自己通过代码创建一个数据库

(2)进到工程后新建文件,选择iOS->CoreData->Data Model,给这个Data Model取一个名字,保存

(3)创建好后工程中多出Model.xcdatamodeld文件,我们可以对这个文件进行操作

(4)左下角有Add Entity按钮,添加一个实体(相当于数据库中的表)。添加一个Entity,取名为Person

(5)选中Person,点击右下角Add Attribute 或右边Attribute栏目中点击加号,

为Person添加属性(我添加了name,age两个属性,设置其类型为string和integer16类型)

2.做好上述操作后到AppDelegate.m文件中写写创建代码,记得包含 <CoreData/CoreData.h>头文件;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

这个方法在程序加载完成后会调用

3.代码创建SQLite数据库

  先理解几个概念:

1.NSManagedObjectContext(负责应用和数据库的交互,所有对数据库的操作都是通过它来完成的)

NSManagedObjectContext拥有一个NSPersistentStoreCoordinator类的实例对象

2.NSPersistentStoreCoordinator(用来添加持久化存储库,这里是SQLite数据库)

NSPersistentStoreCoordinator拥有一个 NSManagedObjectModel类的实例对象

3. NSManagedObjectModel(CoreData的模型文件,本例中就是上面创建Model.xcdatamodeld的模型)

NSManagedObjectModel有entities(数组)这个属性(本例中就是指Person,因为只创建了Person这一个实体,所以数组中就只有这一个元素)

4.NSManagedObject(对象模型,例如下面代码中要新建的personOne)

5.NSEntityDescription(用来描述实体)想要添加到数据库的模型不能用alloc init 来创建,只能用NSEntityDescription来描述

  //构建路径,获取到沙盒里的Documents路径
NSURL *documentURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
//打印沙盒路径,方便后面查看
NSLog(@"%@",documentURL); //经过编译后数据模型文件的扩展名由xcdatamodeld变成了momd
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; //构建CoreData的模型文件,就是Model.xcdatamodeld的模型
NSManagedObjectModel *managedModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //通过模型文件创建PersistentStoreCoordinator对象,
NSPersistentStoreCoordinator *persistStore = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedModel]; //构造数据库存储路径URL
NSURL *persistStoreURL = [documentURL URLByAppendingPathComponent:@"Model.sqlite"]; //设置persistStore的持久化存储方式为SQLiteStoreType,代表persistStore会自动生成一个SQLite数据库文件来实现持久化存储,并会自动生成SQL语句来做CRUD(增删改查)
[persistStore addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:persistStoreURL options:nil error:nil]; //NSManagedObjectContext:所有的ManagedObject的CRUD都是在context上进行的。
//NSMainQueueConcurrencyType:这个context所关联的控制器和UI控件只能在主线程中使用
NSManagedObjectContext *managerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; //建立persistStore和context的关联
[managerContext setPersistentStoreCoordinator:persistStore]; //创建需要保存的对象personOne
NSManagedObject *personOne = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managerContext];
//设置personOne的属性,这里personOne和我们平常用的person实例有一点区别,它无法通过点语法直接拿到属性(后面有解决方法),只能通过KVC来设置它的属性
[personOne setValue:@23 forKey:@"age"];
[personOne setValue:@"wl" forKey:@"name"]; //保存数据
if ([managerContext save:nil])
{
NSLog(@"保存数据成功");
}

4.运行,可以看到如下打印结果

5.复制路径去沙盒里查看,注意复制的时候路径的正确性,去掉前面的file://

6.可以看到数据库已经创建成功,打开数据库可以看到数据也已经成功添加了(我用的数据库管理软件是SQLiteManager百度一下就有了)

7.上面已经完成了简单的数据库创建,然而还是有一些问题

显然personOne的属性通过KVC的方式设置不太好,解决:我们可以自己创建Person类来设置属性,CoreData为我们提供了一种简单的方法

  command+n,选择iOS->CoreData->NSmanagerObject subclass

8.next->勾选上dataModel-> next->勾选上Person创建,系统会帮我们自动生成4个文件

这里可能会出现一个问题勾选好dataModel后后面Select the entities 这里没有实体给你勾选,

  可以点击右边文件列表里的Model.xcdatamodeld,然后选择

  就可以成功选择了;

9.在AppDelegate.m中导入Person.h并修改代码managerObject 部分代码

修改前部分

 //创建需要保存的对象personOne
NSManagedObject *personOne = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managerContext];
//设置personOne的属性,这里personOne和我们平常用的person实例有一点区别,它无法通过点语法直接拿到属性(后面有解决方法),只能通过KVC来设置它的属性
[personOne setValue:@23 forKey:@"age"];
[personOne setValue:@"wl" forKey:@"name"];

这部分替换成

Person *personTwo = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managerContext];
personTwo.age = @100;
personTwo.name = @"lw";

10.运行,查看数据库,数据也成功添加进去了

11.知道了整个过程后现在再新建一个工程看系统是勾选Use Core Data看看Xcode是如何实现的

(1)AppDelegate.h  多出了3个属性和2个方法,AppDelegate.m是实现过程(就不放上来了,可以自己新建一个工程看,思路是一致的,考虑的更全面,

熟悉过程后创建可以直接copy系统的实现代码。

  

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

    

CoreData的简单使用(一)数据库的创建的更多相关文章

  1. 【CoreData】 简单地使用

    先介绍一下什么是CoreData —— 它是在iOS5之后出现的一个框架,提供了对象-关系映射(ORM)的功能,既能够将OC对象转化成数据,保存在SQLite数据库文件中,也能将保存在数据库中的数据还 ...

  2. iOS 中CoreData的简单使用

    原文链接:http://www.jianshu.com/p/4411f507dd9f 介绍:本文介绍的CoreData不在AppDelegate中创建,在程序中新建工程使用,即创建本地数据库,缓存数据 ...

  3. CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移

    上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...

  4. SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...

  5. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  6. 【ASP.NET Core】EF Core 模型与数据库的创建

    大家好,欢迎收看由土星卫视直播的大型综艺节目——老周吹逼逼. 今天咱们吹一下 EF Core 有关的话题.先说说模型和数据库是怎么建起来的,说装逼一点,就是我们常说的 “code first”.就是你 ...

  7. Oracle 11g数据库的创建

    由于是自己自学Oracle,如果有问题,请大家指出,谢谢! Oracle提供了DBCA来创建数据库,对于初学者来说使用DBCA创建数据库简化了很多工作和设置,直接在交互界面即可实现所有的功能. 然而对 ...

  8. Duplicate复制数据库并创建物理StandBy(spfile+不同实例名+不同路径)

    过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...

  9. Duplicate复制数据库并创建物理StandBy(spfile+不同实例名)

    过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...

随机推荐

  1. IOS之表视图添加搜索栏

    下面是我们要实现的效果.本效果是在上一篇自定义表视图的基础上进行更改的.     1.将Search bar and search display拖动到ViewController中.不要添加Sear ...

  2. Swift Explore - 关于 Swift 中的 isEqual 的一点探索

    在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C ...

  3. iOS8中如何将状态栏的字体颜色改为白色

    网上的一些方法在我这行不通, 比如: UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent ...

  4. SharePoint 2010 设置宽度1024px

    在模板页中找到 s4-workspace,设置class=”s4-nosetwidth“,然后再设置宽度为1024px:如果要居中,设置style=“margin:0 auto” 这样也会有一个问题: ...

  5. Qt 读取txt文件乱码的解决办法

    Qt 读取txt文本乱码问题 2015-05-20 15:46 方法一:使用QString的fromLocal8Bit()函数 复制代码 QFile txtfile(filePath);        ...

  6. html a 链接

    1.链接元素 文本.图像.热区 2.标记 描述性文字 target窗口形式 _self:在自身窗口打开(默认) _blank:在新窗口打开 _parent:在父窗口打开 _top:在顶窗口打开 框架或 ...

  7. 【上传AppStore】iOS项目上传到AppStore步骤流程(第三章) - 基本信息总汇

    一.App ID(bundle identifier) App ID即Product ID,用于标识一个或者一组App. App ID应该和Xcode中的Bundle Identifier是一致(Ex ...

  8. 国内最快的jquery cdn

    cdnjs.cn是cdnjs.com在国内的镜像服务,项目托管与著名的又拍云存储,目前又拍云在全国有几十个cdn节点,并且还在增加中. cdnjs.cn 托管的jquery相信会成为国内最快的jque ...

  9. Jquery获取选中的checkbox的值

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  10. android应用程序的安装方式与原理

    android应用程序的安装方式与原理 四种安装方式: 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面 ...