iOS 9及更低版本不支持Xcode 8自动生成的Core Data堆栈

时间:2017-02-22 17:10:12

标签: ios core-data xcode8

标题解释了确切的问题。基本CoreData主详细信息模板仅适用于iOS 10及更高版本。但是如果你试图在iOS 9或更低版本上运行相同的模板,它会崩溃,因为persistentContainer没有被创建,我们曾经得到NSManagedObjectContext。这是因为最新的iOS 10添加了xCode 8.我看到Swift的解决方法很少,但Objective-C却没有。对Objc有更好的解决方案吗?

2 个答案:

答案 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复制核心数据堆栈