标题解释了确切的问题。基本CoreData主详细信息模板仅适用于iOS 10及更高版本。但是如果你试图在iOS 9或更低版本上运行相同的模板,它会崩溃,因为persistentContainer
没有被创建,我们曾经得到NSManagedObjectContext
。这是因为最新的iOS 10添加了xCode 8.我看到Swift的解决方法很少,但Objective-C却没有。对Objc有更好的解决方案吗?
答案 0 :(得分:1)
这是解决方案,
由于在iOS 9及更高版本中基本没有persistentContainer
基础设施,你必须自己初始化核心数据堆栈,
将此方法放在您的委托类中的任何位置,这是我们在iOS 10 persistentContainer
介绍之前一直在做的事情。
- (void)initializeCoreData
{
NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}};
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"yourmodelname" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert(mom != nil, @"Error initializing Managed Object Model");
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
_managedObjectContext = moc;
[EFLDatabase sharedDatabaseWithManagedObjectContext:_managedObjectContext];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSLog(@"DOC %@", [documentsURL absoluteString]);
NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"yourmodelname.sqlite"];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
});
}
现在将下面的代码段放到didFinishLaunchingWithOptions
方法中,如果低于10则基本检查iOS版本,然后执行上述方法,
if ([[NSProcessInfo processInfo] operatingSystemVersion].majorVersion < 10) {
[self initializeCoreData];
}
答案 1 :(得分:0)
下载Xcode 7,从模板创建项目并检查使用核心数据,并从App Delegate复制核心数据堆栈