CoreData从入门到精通一(数据模型+栈的创建)

2018-05-04  本文已影响39人  Moker_C

一、coredata数据模型的创建

想要使用 CoreData ,第一部是是创建数据模型,它描述了数据的结构和关联关系等。可以理解为数据库中的表结构。在 Xcode 创建工程时,提供了创建 CoreData 的模板,只需要我们在创建时,勾选 CoreData 选项,Xcode 就会自动创建出数据模型文件: 屏幕快照 2018-05-04 下午1.43.21.png
它是一个 .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》:

image

具体创建上代码:
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;
上一篇下一篇

猜你喜欢

热点阅读