六行代码写完Core Data初始化

iOS小白经常遇到CoreData初始化记不住,不理解的问题,接下来用6行代码带你解决这个困扰。

第一行: 创建 managed object model

.xcdatamodel在app build的时候会转换成.mond文件,用来操作整个model。创建model的主要用途就是把它传递给coordinator。
两种初始化方法如下,其中,第二种更加方便代码重用:

  1. initWithContentsOfURL指定一个具体的文件
  2. mergedModelFromBundles
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];

第二行:创建 persistent store coordinator

CoreData背后的主要管理者,它在应用和持久层(通常情况下是SQLite文件)之间传递数据。创建coordinator的主要用途就是把它传给context。

NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

第三行:指定存储路径

这行代码因人而异,通常可以放到Document目录下。

NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"Database.sqlite"];

第四行:创建 persistent store

因为要在六行写完初始化,这里不进行额外的配置和容错处理。

[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];

第五行:创建 managed object context

这个就是我们经常要使用的了,这里有两个小建议:

  1. 可以做成单例来访问context
  2. 可以用代码注入的方式传入context。
self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

第六行: 把 persistent store 加入 coordinator

self.managedObjectContext.persistentStoreCoordinator = coordinator;

OK至此六行代码搞定初始化。这个便于大家记忆初始化要干什么。接下来代码示例我会把容错处理也加上。

完整代码

加上这段代码之前需要做的几个小细节:

  • 添加Core Data framework
  • #import
  • xcode当中创建一个managed object model。
-(void)setUpCoreDataStack
{
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
    NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"Database.sqlite"];
    
    NSDictionary *options = @{NSPersistentStoreFileProtectionKey: NSFileProtectionComplete,
                              NSMigratePersistentStoresAutomaticallyOption:@YES};
    NSError *error = nil;
    NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:&error];
    if (!store)
    {
        NSLog(@"Error adding persistent store. Error %@",error);

        NSError *deleteError = nil;
        if ([[NSFileManager defaultManager] removeItemAtURL:url error:&deleteError])
        {
            error = nil;
            store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:&error];
        }
        
        if (!store)
        {
            // Also inform the user...
            NSLog(@"Failed to create persistent store. Error %@. Delete error %@",error,deleteError);
            abort();
        }
    }
    
    self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    self.managedObjectContext.persistentStoreCoordinator = psc;
}

你可能感兴趣的:(六行代码写完Core Data初始化)