1

我一直在我的应用程序中使用 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;
}

在今天之前,我以前从未见过此错误消息。谁能告诉我出了什么问题?感谢您的时间。

4

2 回答 2

2

答案在于

[[NSBundle mainBundle] resourcePath]

mainBundle 资源路径是加载应用程序 IPA 文件中包含的数据的位置,它始终是只读的,您需要在应用程序文件夹中创建 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];
}
于 2013-07-29T07:22:11.477 回答
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,这与只读数据库不兼容。您有 2 个选择:

  1. 将 NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}} 添加到您的选项中
  2. 或使用Liya等工具打开种子数据库并运行“PRAGMA wal_checkpoint(RESTART)”,然后运行“PRAGMA journal_mode = DELETE
于 2014-12-04T14:51:37.793 回答