我一直在我的应用程序中使用Core Data,突然收到如下错误消息:
尝试在路径文件中添加只读文件://localhost/var/mobile/Applications/xxx-xxx-xxx../.app/MyModel.sqlite读/写。将其添加为只读。这将是一个很难的错误;您必须指定NSReadOnlyPersistentStoreOption。
以下方法发生错误:
-(NSPersistentStoreCoordinator*)persistentStoreCoordinator{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSString* path= [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MyModel.sqlite"];
NSURL* storeURL = [[NSURL alloc] initFileURLWithPath:path];
NSError* error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
在今天之前,我从未见过此错误消息。谁能告诉我出了什么问题?谢谢你的时间。
答案 0 :(得分:2)
答案在于
[[NSBundle mainBundle] resourcePath]
mainBundle resourcePath是加载应用程序IPA文件中包含的数据的位置,它始终是readonly,您需要在应用程序文档文件夹中创建sqllite文件
你可以用
替换它NSURL *storeURL = [[self applicationPrivateDocumentFolderURL] URLByAppendingPathComponent:@"MyModel.sqlite"];
- (NSURL *)applicationPrivateDocumentFolderURL
{
if (!m_privateDocumentFolderURL) {
NSString *applicationPrivateDocumentFolderPath = [[NSFileManager defaultManager] applicationSupportDirectory];
m_privateDocumentFolderURL = [[NSURL alloc] initFileURLWithPath:applicationPrivateDocumentFolderPath];
}
return [[m_privateDocumentFolderURL copy] autorelease];
}
答案 1 :(得分:0)
对于任何登陆此处的人,因为他们正在尝试使用他们的应用程序发送只读数据库,这里是创建商店的代码
NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @(true),
NSInferMappingModelAutomaticallyOption: @(true),
NSReadOnlyPersistentStoreOption: @(true))
// The NSReadOnlyPersistentStoreOption is the important one here
NSPersistentStore * seedStore =[coordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"Seed"
URL:[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Seed" ofType:@".sqlite"]]
options:options
error:&error];
此外,在创建数据库时,您可能将日志模式设置为WAL,这与只读数据库不兼容。你有两个选择: