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