美文网首页coredata提升
CoreData可视化创建及初始化(一)

CoreData可视化创建及初始化(一)

作者: 葱花思鸡蛋 | 来源:发表于2019-03-11 16:10 被阅读0次
    1.创建数据模型

    想要使用CoreData,第一部是创建数据模型,它描述了数据的结构和关联关系等。可以理解为数据库中的表结构。
    1)在xcode创建工程时,提供了创建CoreData的模板,只需要我们在创建时,勾选CoreData选项,Xcode就会自动创建数据模型文件,它是一个.xcdatamodeld格式的文件。.xcdatamodeld 编译后为 .momd 文件或 .mom 文件。
    2)后期手动添加。如果创建时没有勾选CoreData,当然也可以在file->new->file 里手动添加这个文件:

    图1.1.png

    3)添加实体 (相当于数据库中的表)


    图1.3.png

    4)点击add entity 可以添加一个实体


    图1.4.png

    Attributes: 定义属性,relationship 定义表间关联关系:一对一,一对多,多对多。
    选中一个字段,可以在右侧的面板中对它做一些自定义:例如在validation 里对数据做一些限制,字符串的长度,数字类型的最大值最小值。设置索引、默认值等。


    图1.4.1.png

    5)生成实体类
    创建完实体之后,如果直接编译build一下,系统会自动生成对应的实体类,就是将实体(表)转化为类(面向对象),便于面向对象进行操作。但自动生成的实体类文件不会显示出来,但通过头文件就可以直接引用。后面会介绍什么时候用到。


    图1.5.png

    配置成手动生成的:选中你创建的实体,然后选择右侧面板顶部最右侧的按钮,然后找到Codegen ,把class definition 改成manual/none ,然后Xcode就不会自动生成了 。


    图1.5.1.png

    注意:经过实际项目应用不建议手动生成实体类,用系统默认就好。原因是当你的表结构改变时如添加字段,修改字段类型等,需要把之前手动创建的实体类删除掉 ,然后再次手动生成,而系统自动生成的实体类,在你的表结构改变时只需要删除app重新安装即可。

    此时,如果手动生成实体类的话,文件默认的语言是Swift的,如果想生成OC的,选择右侧面板顶部最左边按钮,Code Generation,进行修改。

    图1.5.2.png

    注意:此时不要编译会报错,因为你选择手动生成实体类,编译后去没有找到对应的实体类,所以报错。

    这个时候需要通过Editor -> Create NSManagedObject Subclass 来生成响应的实体类,手动生成的实体类是显示出来的。此时可以编译下,查看是否报错


    图1.5.3.png
    2.初始化CoreData 栈 (非常重要的一步)

    CoreData 栈是CoreData 初始化被访问的框架对象的集合,以及应用中数据对象和外部数据存储的媒介。CoreData的初始化需要先初始化栈上的三个对象:
    1)NSManagedObjectModel :描述了数据模型的结构信息
    2)NSPersistentStoreCoordinator :数据持久层和内存对象模型的协调器,持久化容器
    3)NSManagedObjectContext :内存中 managedObject 对象的上下文,对数据库的增删改查都需要通过NSManagedObjectContext进行操作


    图2.1.png

    上述三个对象的创建,未封装前可把这三个对象创建在AppDelegate文件,方便全局调用。

    // 放在AppDelegate.h 文件中,增删改查时让外部进行调用
    @property(nonatomic,strong)NSManagedObjectContext *context;
    
    

    在AppDelegate.m中使用懒加载的方式初始化这三个对象

    #import "AppDelegate.h"
    #import <CoreData/CoreData.h>
    #import "Student+CoreDataProperties.h"
    //#import "Student+CoreDataClass.h"
    @interface AppDelegate ()
    @property(nonatomic,readwrite,strong)NSManagedObjectModel *objModel;
    @property(nonatomic,readwrite,strong)NSPersistentStoreCoordinator *persistentCoordinator;
    @end
    @implementation AppDelegate
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
      
        return YES;
    }
    // 懒加载
    - (NSManagedObjectModel *)objModel{
        if (!_objModel) {
    //      Model  保持和xcdatamodeld 文件名一致,不然modelUrl 为nil
            NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
            _objModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
        
        }
        return _objModel;
    }
    - (NSPersistentStoreCoordinator *)persistentCoordinator{
        if (!_persistentCoordinator) {
    //        创建coordinator 需要用到NSManagedObjectModel 对象
            _persistentCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.objModel];
    //        指定数据库文件
            NSString *urlStr = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"myCoreData.sqlite"];
            NSURL *url = [NSURL fileURLWithPath:urlStr];
            NSError *error;
            [_persistentCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
            if (error) {
                NSLog(@"创建持久化容器失败 %@",error);
            }
        }
        return _persistentCoordinator;
    }
    //        数据操作上下文
    - (NSManagedObjectContext *)context{
        if (!_context) {
            _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            _context.persistentStoreCoordinator = self.persistentCoordinator;
        }
        return _context;
    }
    
    

    此时CoreData已经初始化完毕,下篇文章会进行CoreData增删改查的使用。

    相关文章

      网友评论

        本文标题:CoreData可视化创建及初始化(一)

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