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

  1. 创建工程时, 勾选Use Core Data.
  2. 手动添加, (如何要想向创建时没有选择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]);
 }
}

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.其他记录

方便查阅

  1. 通过core data存储任意类型的数据:http://blog.csdn.net/likendsl/article/details/8549333
  2. 多表关联时, 动态设置删除关系.:http://blog.csdn.net/fengsh998/article/details/8090111
  3. 批量操作、聚合操作、WWDC 2015新特性: http://www.cocoachina.com/ios/20150730/12785.html

4.问题记录

当查询返回数据是fault时, 可以加上这句试试:
[request setReturnsObjectsAsFaults:NO];

学习记录, 如有错误, 敬请指出, 谢谢

时间: 2024-12-30 00:30:15

Core Data 学习简单整理01的相关文章

关于Core Data的一些整理(三)

关于Core Data的一些整理(三) 关于Core Data Stack的四种类与它们的关系如下: NSManagedObjectModel NSPersistentStore NSPersistentStoreCoordinator NSManagedObjectContext 手写Core Data Stack,新建文件继承NSObject,并且在其中要依次初始化三个对象:NSManagedObjectContext.NSPersistentStoreCoordinator.NSManag

关于Core Data的一些整理(二)

关于Core Data的一些整理(二) 创建NSManagedObject的子类时,有一点是在这中间要强调的一点是,要不要勾选 Use scalar properties for primitive data types. 勾选上这个选项之后就是使用的是你在定义的时候使用的原始数据类型. 如果没有勾选的话,就会存在类型的转化,转换情况如下: String maps to String Integer 16/32/64, Float, Double and Boolean map to NSNum

关于Core Data的一些整理(一)

关于Core Data的一些整理(一) 在Xcode7.2中只有Mast-Debug和Single View中可以勾选Use Core Data 如果勾选了Use Core Data,Xcode会自动在AppDelegate中帮你生成Core Data的核心代码,并且自动生成.xcdatamodeld数据文件 1 //Appdelegate.h中 2 #import <UIKit/UIKit.h> 3 #import <CoreData/CoreData.h> 4 5 @inter

Core Data 学习: 数据模型(Data Model)

 数据模型(Data Model) 前面文章中介绍了Core Data堆栈,它是Core Data的核心部分.并且了解了Core Data堆栈中管理对象上下文(managed object context),持久化存储协调者(persistent store coordinator),管理对象模型(managed object model)等组成部分.这篇文章我们将集中了解Core Data中的数据模型(data model). 在我们的应用中,管理对象模型(NSManagedObjectMod

Core Data 学习:轻量级版本迁移(Lightweight Migration)

什么时候需要版本迁移呢? 答案很简单,什么时候改变数据模型,什么时候就需要版本迁移. Core Data支持对数据模型(data model)改变的管理.改变数据模型将造成该数据模型与之前的持久化存储(stores)不兼容,而出现错误.所以,如果我们改变了自己的数据模型,就需要将原有的持久化存储中的数据转移到新的模型版本,这一过程就称为版本迁移(migration). 为什么需要进行版本迁移? 当我们发布应用之后,再添加一些新的特性,我们将需要更新持久化存储.在我们开发的过程中,很好操作,删除A

Core Data的简单用法

1 #import "ViewController.h" 2 3 // 第一步:引入头文件AppDelegate 4 #import "AppDelegate.h" 5 #import "Person.h" 6 #import "Car.h" 7 8 @interface ViewController () 9 10 // 第二步:声明属性[管理对象上下文](SQLite中是声明一个存储路径的属性) 11 @property

使用Core Data应避免的十个错误

Core Data是苹果针对Mac和iOS平台开发的一个框架,主要用来储存数据.对很多开发者来说,Core Data比较容易入手,但很难精通,如果没有正确的学习方法,你将很难真正理解它,更不用说精通了.很多开发者常常在这方面犯一些错误,而这篇文章列出了开发者在iOS开发过程中使用Core Data常见的一些错误,并对如何避免这些错误进行了分析.   1.不了解关键术语 对于iOS开发者来说,会使用Core Data是一项必备技能. 没有它,很多app都不会存在.当在互联网上四处搜索Core D

iOS开发过程中使用Core Data应避免的十个错误

原文出处: informit   译文出处:cocoachina Core Data是苹果针对Mac和iOS平台开发的一个框架,主要用来储存数据.对很多开发者来说,Core Data比较容易入手,但很难精通,如果没有正确的学习方法,你将很难真正理解它,更不用说精通了.很多开发者常常在这方面犯一些错误,而这篇文章列出了开发者在iOS开发过程中使用Core Data常见的一些错误,并对如何避免这些错误进行了分析.  1.不了解关键术语 对于iOS开发者来说,会使用Core Data是一项必备技能.

IOS 数据存储之 Core Data详解

Core Date是ios3.0后引入的数据持久化解决方案,它是是苹果官方推荐使用的,不需要借助第三方框架.Core Date实际上是对SQLite的封装,提供了更高级的持久化方式.在对数据库操作时,不需要使用sql语句,也就意味着即使不懂sql语句,也可以操作数据库中的数据. 在各类应用开发中使用数据库操作时通常都会用到 (ORM) "对象关系映射",Core Data就是这样的一种模式.ORM是将关系数据库中的表,转化为程序中的对象,但实际上是对数据中的数据进行操作. 在使用Cor