用CoreData的话.就不要把它当做一般的关系型数据库来用了.
1.创建CoreData数据库文件
1.1.创建工程的时候创建
如果是创建工程的时候创建的话.可以勾选.
☑️ Use Core Data
1.2工程内创建
和一般创建的空项目来说的话.在Appdelegate里头 多了俩东西.
appdelegate里头有一代码我比较在意
意思是.在应用将要结束的时候保存一下上下文栈~~~然而.实测的时候有时候应用挂了.也没有保存完…
模型文件
不知道大家注意没注意到Project里头的.xcdatamodeled文件
这玩意就是传说中的数据库模型文件.打开之后如下.
其实我们需要关心的就是这个Entity(实体).也可以被称为"表".
Attributes就是属性.对应的就是表中的字段
这个部分准备下次开贴再讲.
上面提到的东西基本就是数据库最基本的东西了.数据库文件、表、属性
不过这个数据库文件我们讲到的仅仅是右键创建的而已.还不知道如何使用.
CoreData的数据操作
- (void)saveContext {
NSManagedObjectContext *context = self.persistentContainer.viewContext;
NSError *error = nil;
if ([context hasChanges] && ![context save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, error.userInfo);
abort();
}
}
首先,我们对CoreData的数据操作其实操作的是CoreData的context(上下文).
在应用结束的时候调用的saveContext使用的是self.persistentContainer.viewContext.
@synthesize persistentContainer = _persistentContainer;
- (NSPersistentContainer *)persistentContainer {
@synchronized (self) {
if (_persistentContainer == nil) {
_persistentContainer = [[NSPersistentContainer alloc] initWithName:@"CoreData"];
[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
if (error != nil) {
NSLog(@"Unresolved error %@, %@", error, error.userInfo);
abort();
}
}];
}
}
return _persistentContainer;
}
NSPersistentContainer这个类在iOS10以上才有.大大简化了CoreData的创建.initWithName:方法中这个Name正是
这个模型文件的name.(PS.这个模型文件是.momd后缀.)
+ (instancetype)persistentContainerWithName:(NSString *)name managedObjectModel:(NSManagedObjectModel *)model;
NSPersistentContainer类中有初始化方法中的NSManagedObjectModel就是你的"表文件"里头有"表中对应的字段".
对应全兼容的就是下面这样的
- (NSManagedObjectContext *)context {
if (!_context) {
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_context.persistentStoreCoordinator = self.persistentStoreCoordinator;
}
return _context;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (!_persistentStoreCoordinator) {
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
/// 你的数据库文件的保存路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:[NSString stringWithFormat:@"/%@",@"xxx"]];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:path] options:nil error:nil];
}
return _persistentStoreCoordinator;
}
- (NSManagedObjectModel *)managedObjectModel {
if (!_managedObjectModel) {
/// 这里就是比上面的麻烦的地方,需要指定CoreData的"名字".有个momd后缀.
NSURL *url = [[NSBundle mainBundle] URLForResource:@"CoreData" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
}
return _managedObjectModel;
}