iOS小白经常遇到CoreData初始化记不住,不理解的问题,接下来用6行代码带你解决这个困扰。
第一行: 创建 managed object model
.xcdatamodel在app build的时候会转换成.mond文件,用来操作整个model。创建model的主要用途就是把它传递给coordinator。
两种初始化方法如下,其中,第二种更加方便代码重用:
-
initWithContentsOfURL指定一个具体的文件 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
这个就是我们经常要使用的了,这里有两个小建议:
- 可以做成单例来访问context
- 可以用代码注入的方式传入context。
self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
第六行: 把 persistent store 加入 coordinator
self.managedObjectContext.persistentStoreCoordinator = coordinator;
OK至此六行代码搞定初始化。这个便于大家记忆初始化要干什么。接下来代码示例我会把容错处理也加上。
完整代码
加上这段代码之前需要做的几个小细节:
- 添加Core Data framework
- #import <CoreData/CoreData.h>
- 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;
}











网友评论