CoreData从入门到精通一(数据模型+栈的创建)
一、coredata数据模型的创建
它是一个 .xcdatamodeld 格式的文件: 屏幕快照 2018-05-04 下午1.46.29.png
如果创建时没有勾选 CoreData,当然也可以在 File -> new -> file 里手动添加这个文件: image
选中之后页面: 屏幕快照 2018-05-04 下午1.51.19.png
Entity:数据实体,相当于数据库中的一张张表
coredata支持的数据类型:
image
选中一个字段,可以对其进行一些自定义,例如在 validation 里对数据做一些限制,字符串的长度,数字类型的最大最下值;设置索引、默认值等。不同的数据类型可以设置不同的内容,一般维持默认就可以
屏幕快照 2018-05-04 下午2.08.33.png
另外对于每一个 entity 实体类,Build 过后 Xcode 都会自动帮我们生成相应的实体类代码,生成的代码不会在工程目录中显示出来,但是可以通过导入头文件索引到;当然也可以配置成手动生成的,选中对应的 Entity 然后点击右侧面板的 Codegen,把 ClassDefinition 修改成 Manual/None,然后 Xcode 就不会再自动生成了 屏幕快照 2018-05-04 下午2.14.09.png
另外,Xcode 自动生成的代码都是 Swift 语言的,如果想改成Objc,可以在这里改: 屏幕快照 2018-05-04 下午2.17.02.png
这个时候也可以通过 Editor -> Create NSManagedObject Subclass 来生成相应的实体类:
image
需要注意的是,如果前面有自动生成过这些类文件,手动生成后可能会编译出错,因为工程里会索引到两份同样的代码,这个时候需要 Clean 一下工程再 Build 即可
下面是生成的实体类: 屏幕快照 2018-05-04 下午2.20.19.png 屏幕快照 2018-05-04 下午2.20.34.png
至此,coredata的数据模型就创建好了
二、coredata栈的创建
数据模型创建好之后,想要使用 CoreData 进行数据持久化,下一步就是初始化 CoreData 栈了,CoreData 栈是 CoreData 初始化被访问的框架对象的集合,以及应用中数据对象和外部数据存储的媒介。CoreData 的初始化需要一步步地初始化 CoreData 栈上的三个对象结构,它们分别是:
NSManagedObjectModel — 描述了数据模型的结构信息
NSPersistentStoreCoordinator — 数据持久层和内存对象模型的协调器
NSManagedObjectContext — 内存中 managedObject 对象的上下文
下图是 CoreData 栈的结构,图片来自 objc.io 的图书 《CoreData》:
具体创建上代码:
1、创建ManagedObjectModel
先将三个对象都进行了声明
@interface AppDelegate ()
@property (nonatomic, readwrite, strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, readwrite, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, readwrite, strong) NSManagedObjectContext *managedObjectContext;
@end
//创建NSManagedObjectModel对象,它需要通过数据模型(CoreDataDemo.xcdatamodeld)来创建
- (NSManagedObjectModel *)managedObjectModel {
if (!_managedObjectModel) {
// url 为CoreDataDemo.xcdatamodeld,注意扩展名为 momd,而不是 xcdatamodeld 类型
NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
}
return _managedObjectModel;
}
2、创建 PersistentStoreCoordinator
创建好 managedObjectModel 后就可以来创建 persistentStoreCoordinator 了,因为它的创建需要用到 managedObjectModel,managedObjectModel 告诉了persistentStoreCoordinator 数据模型的结构,然后 persistentStoreCoordinator 会根据对应的模型结构创建持久化的本地存储
//创建NSPersistentStoreCoordinator
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (!_persistentStoreCoordinator) {
//创建persistentStoreCoordinator需要传入managedObjectModel
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
//指定本地的sqlite数据库文件
NSURL *sqliteURL = [[self documentDirextoryURL] URLByAppendingPathComponent:@"CoreDataDemo.sqlite"];
NSError *error;
//为persistentStoreCoordinator指定本地存储的类型,这里指的是sqlite
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqliteURL options:nil error:&error];
if (error) {
NSLog(@"falied to create persistentStoreCoordinator %@",error.localizedDescription);
}
}
return _persistentStoreCoordinator;
}
//获取document目录
- (nullable NSURL *)documentDirextoryURL {
return [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject;
}
3、创建 ManagedObjectContext
//创建NSManagedObjectContext
- (NSManagedObjectContext *)managedObjectContext {
if (!_managedObjectContext) {
//指定context的并发类型:NSMainQueueConcurrencyType或NSPrivateQueueConcurrencyType
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
}
return _managedObjectContext;
}
至此,CoreData 栈的初始化就创建完成了。以后操作 CoreData 就可以通过 context 属性来完成
Ios10以后出现了一个NSPersistentContainer,CoreData 栈的创建被封装在了 NSPersistentContainer 类中:
Appdelegate中
self.persistentContainer.viewContext
self.persistentContainer.managedObjectModel
self.persistentContainer.persistentStoreCoordinator
其他地方:
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectModel *managedObjectModel = delegate.persistentContainer.managedObjectModel;
NSManagedObjectContext *context = delegate.persistentContainer.viewContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator = delegate.persistentContainer.persistentStoreCoordinator;