Core Data 学习简单整理01
Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作. 能够快速达到项目的存储数据的需求.
CoreData优点:能够合理管理内存,避免使用sql的麻烦,高效, 由于是苹果提供的解决方案, 所以不用太过担心会有其他问题. 我的观念就是先使用上了后再考虑其他, 问题有一个就解决一个.
Core Data 默认使用Sqlite. 因此在沙盒Document文件夹中找到.sqlite的数据库文件. 这里记录一个比较好用的快速打开模拟器沙盒路径的工具: https://github.com/opensim/opensim
1.如何使用CoreData
- 创建工程时, 勾选Use Core Data.
- 手动添加, (如何要想向创建时没有选择Use Core Data)
如果不知道该添加什么, 一个比较便捷的方法, 是直接新建一个空白工程, 勾选Use Core Data后, 对比AppDelegate.h中的代码, 然后再将多的内容添加到工程中.
添加Core Data后, 在AppDelegate.h中就有帮我们生成用于管理、存储这些模型的对象,我们可以通过添加AppDelegate头文件来使用.
添加Core Data后, 就是建立数据模型,说到模型, 就要提一下Core Data常用的6个对象:
1、NSManagedObjectContext
管理对象,上下文,持久性存储模型对象
2、NSManagedObjectModel
被管理的数据模型,数据结构
3、NSPersistentStoreCoordinator
连接数据库的
4、NSManagedObject
被管理的数据记录
5、NSFetchRequest
数据请求
6、NSEntityDescription
表格实体结构
此外还需要知道.xcdatamodel文件编译后为.momd或者.mom文件
一 开始
右键添加一个Core data -> Data Model(如果创建工程时, 直接勾选use core data, 会直接默认生成.xcdatamodeld).
选中.xcdatamodeld主要使用到了下列一些东西:
Entity: 实体(我们要生成的模型对象的实体, User, Car, Person等等)
Attributes:实体对象属性
ReaationShips:关系
Fetched Properties:
>_<多表关联内容可以看看: http://www.jianshu.com/p/e9f3b5e0cd19
二. 创建实体管理
右键添加一个Core data -> NSManagedObject subclass, 一直选择, 选中Car, Wheel. 到最后会实现
QQ20151206-1.png
三. 导入AppDelegate.h头文件, 开始管理数据库
主要操作:
//先取出coredata上下文管理者
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext context = appDelegate.managedObjectContext;*
//1.保存新数据
Car *car = [NSEntityDescription insertNewObjectForEntityForName: @"Car" inManagedObjectContext: context];
car.carName = label1.text;
car.carType = label2.text;
[appDelegate saveContext];
//2.查询数据
NSError *error;
NSFetchRequest *request = [NSFetchRequest new];
NSEntityDescription *entity = [NSEntityDescription entityForName: @"Car" inManagedObjectContext: context];
[request setEntity: entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"carName=%@", carName];
[request setPredicate:predicate];
NSArray *results = [[context executeFetchRequest: request error: &error] copy];
for (Car *car in results) {
NSLog(@"%@", car.carName);
}
//3.更新数据
{
NSFetchRequest* request=[[NSFetchRequest alloc] init];
NSEntityDescription *car=NSEntityDescription entityForName:@"car" inManagedObjectContext:_myAppDelegate.managedObjectContext];
[request setEntity:car];
///查询条件
NSPredicate* predicate=[NSPredicate predicateWithFormat:@"carName==%@",@"name"];
[request setPredicate:predicate];
NSError* error=nil;
NSMutableArray*
mutableFetchResult=[[_myAppDelegate.managedObjectContext
executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResult==nil) {
NSLog(@"Error:%@",error);
}
NSLog(@"The count of entry: %i",[mutableFetchResult count]);
for (Car* car in mutableFetchResult) {
car.carName = @"name1" ;
...
}
//更新后要进行保存,否则没更新
[_myAppDelegate.managedObjectContext save:&error];
}
//4.删除数据
{
NSFetchRequest* request=[[NSFetchRequest alloc] init];
NSEntityDescription* car=[NSEntityDescription entityForName:@"Car"
inManagedObjectContext:_myAppDelegate.managedObjectContext];
[request setEntity:car];
NSPredicate* predicate=[NSPredicate predicateWithFormat:@"carName==%@",@"name"];
[request setPredicate:predicate];
NSError* error=nil;
NSMutableArray*
mutableFetchResult=[[_myAppDelegate.managedObjectContext
executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResult==nil) {
NSLog(@"Error:%@",error);
}
NSLog(@"The count of entry: %i",[mutableFetchResult count]);
for (Car *car in mutableFetchResult) {
[_myAppDelegate.managedObjectContext deleteObject:car];
}
if ([_myAppDelegate.managedObjectContext save:&error]) {
NSLog(@"Error:%@,%@",error,[error userInfo]);
}
}
- 条件查询的更多内容, 可以查看官方文档:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html
2.NSFetchRequest 常用方法 -setEntity:
设置你要查询的数据对象的类型(Entity)
- -setPredicate:
设置查询条件 - -setFetchLimit:
设置最大查询对象数目 - -setSortDescriptors:
设置查询结果的排序方法 - -setAffectedStores:
设置可以在哪些数据存储中查询
[request setFetchBatchSize:500];//从数据库里每次加载500条数据来筛选数据
[request setFetchOffset:sizeCount];//读取数据库的游标偏移量,从游标开始读取数据
sizeCount = 10;
[request setFetchLimit:10];//每次要取多少条数据,10就是每次从数据库读取10条数据
NSPredicate用于查询和过滤
在SQL中作为查询条件通常用WHERE,但在COREDATA中作为查询条件就可以用到NSPredicate.
NSPredicate 不单可以和COREDATA中的FetchRequest 配合使用。也可以与NSArray配合使用
一个线程用一个NSManagedObjectContext对象.
使用coredata 在项目中建立表,它会自己来生成数据库,而在每个表中都有它自己生成的Z_PK,Z_ENT,Z_OPT 这三个字段,
Z_PK 表的主键,从1开始递增, 具有唯一性
可以通过主键访问和获取对象的途径:
NSFetchRequest request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setResultType:NSManagedObjectIDResultType];
[request setFetchBatchSize:20];
NSError error = nil;
NSArray items = [context executeFetchRequest:request error:&error];
for (NSManagedObjectID objectID in items) {
NSManagedObject* object = [context objectWithID:objectID];
...
}
Z_ENT 表在xcdatamodel 中的索引值,如果有6个表那么它的值的区间就是[1,6 ]
Z_OPT 表示的是每条数据被操作的次数,初始化值为1,只要是增删改查都会加1
3.其他记录
方便查阅
- 通过core data存储任意类型的数据:http://blog.csdn.net/likendsl/article/details/8549333
- 多表关联时, 动态设置删除关系.:http://blog.csdn.net/fengsh998/article/details/8090111
- 批量操作、聚合操作、WWDC 2015新特性: http://www.cocoachina.com/ios/20150730/12785.html
4.问题记录
当查询返回数据是fault时, 可以加上这句试试:
[request setReturnsObjectsAsFaults:NO];
学习记录, 如有错误, 敬请指出, 谢谢
Core Data 学习简单整理01的更多相关文章
- 关于Core Data的一些整理(五)
关于Core Data的一些整理(五) 在Core Data中使用NSFetchedResultsController(以下简称VC)实现与TableView的交互,在实际中,使用VC有很多优点,其中 ...
- 关于Core Data的一些整理(四)
关于Core Data的一些整理(四) 调用Core Data文件中的Request模板进行条件匹配 //获取ObjectModel相当于获取Core Date文件 NSManagedObjectMo ...
- 关于Core Data的一些整理(三)
关于Core Data的一些整理(三) 关于Core Data Stack的四种类与它们的关系如下: NSManagedObjectModel NSPersistentStore NSPersiste ...
- 关于Core Data的一些整理(二)
关于Core Data的一些整理(二) 创建NSManagedObject的子类时,有一点是在这中间要强调的一点是,要不要勾选 Use scalar properties for primitive ...
- 关于Core Data的一些整理(一)
关于Core Data的一些整理(一) 在Xcode7.2中只有Mast-Debug和Single View中可以勾选Use Core Data 如果勾选了Use Core Data,Xcode会自动 ...
- Core Data 的简单使用
认识cocoa Data在ios开发中的环境情况. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/f ...
- Core Data的简单用法
#import "ViewController.h" // 第一步:引入头文件AppDelegate #import "AppDelegate.h" #impo ...
- kafka学习笔记整理01
Apache Kafka 消息中间件->流式数据处理平台 特点: 高可靠性(分布式.分区.复制和容错).高吞吐量.持久化 消息模式:1)队列式(或点对点):在点对点消息系统中,消息被保存在队列中 ...
- 使用Core Data应避免的十个错误
原文:Avoiding Ten Big Mistakes iOS Developers Make with Core Data http://www.cocoachina.com/applenew ...
随机推荐
- 『Python』Python 调用 ZoomEye API 批量获取目标网站IP
#### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...
- 用C#实现网络爬虫(二)
上一篇<用C#实现网络爬虫(一)>我们实现了网络通信的部分,接下来继续讨论爬虫的实现 3. 保存页面文件 这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行 ...
- 关于SD卡
http://blog.csdn.net/androidwifi/article/details/17725989 http://www.cnblogs.com/greatverve/archive/ ...
- 生产环境下,不建议用早期版本的Mono........
一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来
- fg bg 等命令
fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令 ...
- Android子线程更新主界面
学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler ...
- linux之sed用法【转载】
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- Java学习日记-10 集合
集合(Collection) 1. 什么是集合? 集合是一组对象组成的一个整体,又称为容器,集合类属于java.util包.集合不同于数组的地方在于,一是它的容量是可变的,二是集合中只能存储对象,不能 ...
- 利用"NOTIFYICONDATA"实现MFC的托盘程序
本文章为转发百度空间内容,,保存一下,以防以后用到.. 一.自定义信息 在头文件中加入下面这句话: #define WM_SHOWTASK (WM_USER+1) 二.MYDLG.CPP文件中添加_m ...
- Python自动化之Django的CSRF
什么CSRF? CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到你的网站上了,那么当这个 ...