2013-07-29 93 views
1

我在我的应用程序使用了核心数据,突然我有恩的错误信息如下:错误消息

试图添加只读文件的路径文件://本地主机/ 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

答案就在

[[NSBundle mainBundle] resourcePath] 

的mainBundle resourcePath是要加载包含在你的应用程序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]; 
} 
+0

(在我的情况m_privateDocumentFolderURL是一个NSURL属性) –

+0

谢谢你,你让我很快乐! – boochan224

+0

欢迎您! –

0

取代它对于任何人登陆这里,因为他们正试图出货与只读数据库IR的应用,这里的创建存储

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 =删除