1、导入 CoreData 框架:
Build Phases
-> Link Binary With Libraries
-> 添加 CoreData.framework
2、添加 CoreData 模型:
File
-> New
-> File
-> iOS
-> Core Data
-> Data Model
-> XXX.xcdatamodeld
3、创建实体
XXX.xcdatamodeld
-> Add Entity
-> 添加对应的 Attributes
4、自动创建实体关联文件
创建好实体对象XXX.xcdatamodeld
之后,右侧属性栏Code Generation
下面的Language
默认为Swift
,这里使用OC
,就改成Objective-C
;Codegen默认为Class Definition
,无需更改。通过Xcode
的Build
会自动生成对应的实体关联文件,但是这些文件不会在目录中显示出来,但对应的格式为:
//格式
实体名(表名)+CoreDataClass.h
实体名(表名)+CoreDataClass.m
实体名(表名)+CoreDataProperties.h
实体名(表名)+CoreDataProperties.m
//例如,实体名(表名)为Video,对应的关联文件为:
Video+CoreDataClass.h
Video+CoreDataClass.m
Video+CoreDataProperties.h
Video+CoreDataProperties.m
使用对应的实体时,导入对应的头文件即可,例如:
#import "Video+CoreDataClass.h"
5、手动创建实体关联文件
实体对象XXX.xcdatamodeld
里面的Codegen
一定得设置为Manual/None
,否则报文件重复错误,选中实体,点击Editor
,点击Create NSManagedObject Subclass…
生成实体关联文件:
手动创建好关联文件之后,目录如下图所示,用的时候导入对应的Properties头文件即可:
6、创建数据库(例子)
//1、导入对应实体
#import "Video+CoreDataProperties.h"
//2、创建上下文全局变量
@property (strong, nonatomic) NSManagedObjectContext *context;
//3、创建数据库相关代码
- (void)createDataBase {
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dbPath = [docPath stringByAppendingPathComponent:@"video.sqlite"];
NSLog(@"dbPath = %@", dbPath);
NSURL *dbURL = [NSURL fileURLWithPath:dbPath];
NSError *error = nil;
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbURL options:nil error:&error];
if (error) {
NSLog(@"创建数据库失败");
} else {
NSLog(@"创建数据库成功");
}
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_context.persistentStoreCoordinator = store;
}
7、插入数据(例子)
- (void)insertData {
Video *video = [NSEntityDescription insertNewObjectForEntityForName:@"Video" inManagedObjectContext:_context];
video.name = @"山西老妖";
video.url = @"http://video.winson.com.mp4";
NSError *error = nil;
if ([_context save:&error]) {
NSLog(@"插入数据成功");
} else {
NSLog(@"插入数据失败:%@", error);
}
}
8、新增表、增加字段之后的处理
项目中经常有新业务会涉及到新增表、或者修改表结构的操作,这个时候需要对模型对象XXX.xcdatamodeld
进行版本管理,主要包括两个过程:创建新版本模型
+数据迁移
。
- 创建新版本模型:
XXX.xcdatamodeld
->Editor
->Add Model Version...
->XXX2.xcdatamodeld
- 指定新版本:
XXX.xcdatamodeld
-> 右侧属性栏 ->Model Version
->XXX2.xcdatamodeld
在XXX2.xcdatamodeld
中修改后,重新编译,到此,新的配置已经完成,接下来,需要对数据进行迁移。
9、数据迁移
Core Data自带的轻量级的数据迁移
和Core Data手动创建Mapping文件进行迁移
- Core Data自带的轻量级的数据迁移
NSDictionary *options = @{NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}, //禁用日志
NSMigratePersistentStoresAutomaticallyOption: @YES, //自动迁移
NSInferMappingModelAutomaticallyOption: @YES}; //自动创建迁移文件
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbURL options:options error:&error];
- Core Data手动创建Mapping文件进行迁移
这种方式也要设置上面两个参数,只不过自己创建Mapping文件相对更灵活,更准确,可以完成更为复杂的迁移操作:
New File
->Core Data
->Mapping Model
->选择需要Mapping的源数据库
->再选择目标数据库
->AAA.xcmappingmodel
然后进行Build
操作,旧的数据将会按照Mapping
文件的规则迁移到XXX2.xcdatamodeld