美文网首页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