核心数据中的错误消息

时间:2013-07-29 06:58:49

标签: ios core-data

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

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

2 个答案:

答案 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,这与只读数据库不兼容。你有两个选择:

  1. 添加NSSQLitePragmasOption:@ {@" journal_mode" :@"删除"}}到您的选项
  2. 或使用诸如Liya之类的工具打开种子数据库并运行" PRAGMA wal_checkpoint(RESTART)"然后是" PRAGMA journal_mode = DELETE