美文网首页
CoreData从入门到精通一(数据模型+栈的创建)

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

作者: Moker_C | 来源:发表于2018-05-04 13:47 被阅读39次

    一、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;
    

    相关文章

      网友评论

          本文标题:CoreData从入门到精通一(数据模型+栈的创建)

          本文链接:https://www.haomeiwen.com/subject/bbokrftx.html