Название объясняет точную проблему. Основной шаблон основной детали CoreData работает только на iOS 10 и выше. Но если вы попытаетесь запустить тот же шаблон на iOS 9 или ниже, он потерпит крах, потому что persistentContainer
не был создан, который мы использовали для получения NSManagedObjectContext
. Это связано с последним дополнением iOS 10 с xCode 8. Я видел, что для Swift существует несколько обходных решений, но не для Objective-C. Любое лучшее решение для Objc?Исходный код ядра Core Xcode 8 не поддерживается с iOS 9 и ниже
1
A
ответ
1
Вот решение,
Поскольку в прошивке 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
метод, который будет в основном проверяет версию IOS, если ниже 10, а затем выполняет вышеупомянутый метод,
if ([[NSProcessInfo processInfo] operatingSystemVersion].majorVersion < 10) {
[self initializeCoreData];
}
0
Скачать Xcode 7, создать проект из шаблона и проверить использование основных данных и скопировать стек основные данные из App делегат
Спасибо за ответ. Я уже пробовал, но, к сожалению, это не сработало для меня. –
Когда вы говорите: «это не сработало для меня», в чем же проблема? –
Ну, он не вызвал метод «managedObjectContext» автоматически, чтобы продолжить создание контекста. –