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. Unity3d之Animation(动画系统)

    1,动画系统配置,2,代码控制动画 原文地址: http://blog.csdn.net/dingkun520wy/article/details/51247487 1,动画系统配置 创建游戏对象并添 ...

  2. P1119: [POI2009]SLO

    这题预处理稍微动动脑,其实还是个裸的置换群=-=,没什么压力. ; var n,i,j,minx,tem,now,tmin,len:longint; cursum,sum:int64; pos,num ...

  3. 制作OpenStack用的RHEL7系统镜像

    制作OpenStack使用的RHEL7系统镜像,并进行相关设置,安装XRDP以进行远程访问. 1.在KVM中安装RHEL7.2客户机: 2.设置网卡为dhcp并onboot=yes,使得虚拟机能自动获 ...

  4. 添加swap分区

    1.创建swap文件,可以单独划分一个分区出来,也可以直接生成一个swap文件 dd if=/dev/zero of=swap bs=1M count=1024 2.格式化为swap文件 mkswap ...

  5. js 完成对图片的等比例缩放的方法

    /* 重新按比例设置 页面上对应图片的长和高, */ function resetImgSize(id,imgWidth,imgHeight,posWidth,posHeight) { var wid ...

  6. 设置 Eclipse 智能代码提示,大幅度减少 alt+/ 使用频率,打每个字都出现代码提示的办法

    以前网上有个英文版本的,现在自己汉化一下...O(∩_∩)O 哈哈 ~   http://www.cnblogs.com/lidabo/archive/2013/03/05/2944245.html ...

  7. WEB学习总结 +数据结构

    HTML5  <h1>会员注册界面</h1><form action="process.aspx" method="post" n ...

  8. C++ Template之函数模版

    函数模版的定义: template <typename T> T const& max(const T& a,const T b) { return a > b ? ...

  9. zoj 2314 Reactor Cooling 网络流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 The terrorist group leaded by a ...

  10. 【POJ】【2699】The Maximum Number of Strong Kings

    网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...