gpt4 book ai didi

ios - 更改 Core Data 初始化方式后数据库无法打开

转载 作者:行者123 更新时间:2023-11-29 12:58:48 28 4
gpt4 key购买 nike

这是我应用程序中的当前初始化代码,基于 Paul Hegarty 的 cs193p:

UIManagedDocument *database = nil;

if (!database) {
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"stdDatabase"];
database = [[UIManagedDocument alloc] initWithFileURL:url];

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
database.persistentStoreOptions = options;
}

if (![[NSFileManager defaultManager] fileExistsAtPath:[database.fileURL path]]){
[database saveToURL:database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
completionBlock(database);
}];
} else if (database.documentState == UIDocumentStateClosed){
[database openWithCompletionHandler:^(BOOL success){
completionBlock(database);
}];
} else if (database.documentState == UIDocumentStateNormal) {
completionBlock(database);
}

这是我想使用的新初始化代码,基于 Marcus Zarra 的“核心数据”一书:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Corrida_de_Leitos" withExtension:@"momd"];
ZAssert(modelURL, @"Failed to find model URL");

NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
ZAssert(mom, @"Failed to initialize model");

NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
ZAssert(psc, @"Failed to initialize persistent store coordinator");

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];

[self setManagedObjectContext:moc];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *storeURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
storeURL = [storeURL URLByAppendingPathComponent:@"stdDatabase"];

NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setValue:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setValue:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

NSError *error = nil;
NSPersistentStoreCoordinator *coordinator = [moc persistentStoreCoordinator];
NSPersistentStore *store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
if (!store) {
NSLog(@"Error adding persistent store to coordinator %@\nUSERINFO:\n%@", [error localizedDescription], [error userInfo]);
}

dispatch_sync(dispatch_get_main_queue(), ^{
[self contextInitialized];
});
});

这是将商店添加到协调器时出现的错误:

'Error adding persistent store to coordinator The operation couldn’t be completed. (Cocoa error 256.)
USERINFO:
{
NSSQLiteErrorDomain = 14;
NSUnderlyingException = "unable to open database file";
}'

如何修复新代码,使其能够打开旧数据库文件?

最佳答案

UIManagedDocument 将在 UIManagedDocument 包(目录)中创建此 sqlite 文件,因此您需要获取原始 sqlite 文件的 URL,并将其用作新版本应用程序中的 URL,如有必要,请使用 NSFileManager将文件移动到另一个位置,但这并不是真正必要的。请参阅 UIManagedDocument 中的示例目录结构,一个用于本地,一个用于 iCloud 同步存储。如果不是 iOS7,则检查,因为结构/名称可能不同。

理论上,您可以从 UIManagedDocument.persistentStoreName 获取实际的存储文件名,并将其简单地附加到 UIManagedDocument.fileURL - 但实际上这忽略了 StoreContent 我认为是子目录。

通常 UIManagedDocument 会在 "stdDatabase/StoreContent/persistentStore" 处创建文件。但要确保在模拟器中运行原始版本的应用程序,然后检查究竟是什么路径用于创建商店文件。

只要您使用相同的选项打开,实际的 sqlite 文件应该可以正常工作。

enter image description here

关于ios - 更改 Core Data 初始化方式后数据库无法打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313321/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com