天天看点

CoreData篇(一)-创建CoreData数据库文件

用CoreData的话.就不要把它当做一般的关系型数据库来用了.

1.创建CoreData数据库文件

1.1.创建工程的时候创建

CoreData篇(一)-创建CoreData数据库文件

如果是创建工程的时候创建的话.可以勾选.

☑️ Use Core Data

1.2工程内创建

CoreData篇(一)-创建CoreData数据库文件
CoreData篇(一)-创建CoreData数据库文件

和一般创建的空项目来说的话.在Appdelegate里头 多了俩东西.

CoreData篇(一)-创建CoreData数据库文件
CoreData篇(一)-创建CoreData数据库文件

appdelegate里头有一代码我比较在意

CoreData篇(一)-创建CoreData数据库文件

意思是.在应用将要结束的时候保存一下上下文栈~~~然而.实测的时候有时候应用挂了.也没有保存完…

模型文件

不知道大家注意没注意到Project里头的.xcdatamodeled文件

CoreData篇(一)-创建CoreData数据库文件

这玩意就是传说中的数据库模型文件.打开之后如下.

CoreData篇(一)-创建CoreData数据库文件

其实我们需要关心的就是这个Entity(实体).也可以被称为"表".

CoreData篇(一)-创建CoreData数据库文件

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正是

CoreData篇(一)-创建CoreData数据库文件

这个模型文件的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;
}
           

继续阅读