无法在Core Data中创建只读sqlite存储:Cocoa Error 260

我正在尝试使用readonly选项( NSReadOnlyPersistentStoreOption )创建NSReadOnlyPersistentStoreOption 。 如果sqlite文件不存在,则会失败(请参阅下面的代码)。 如果确实存在,则添加商店时没有任何错误。

我得到的错误是Cocoa Error 260

 NSFileReadNoSuchFileError = 260, // Read error (no such file) 

所以看起来CoreData试图读取一个不存在的文件,而不是创建一个新文件……

似乎在添加NSReadOnlyPersistentStoreOption您只能打开以前存在的存储,但不能创建一个存储。 这对我来说没有意义。

有没有办法在Core Data中创建一个全新的只读商店?

如果没有,是否有一些解决方法?

 // DB URL NSFileManager *fm = [NSFileManager defaultManager]; NSURL *dbURL = [[fm URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; dbURL = [dbURL URLByAppendingPathComponent:@"store.sqlite"]; // Object Model NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; NSAssert([fm fileExistsAtPath:[modelURL path]], @"File not found"); NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; // Store Coordinator NSPersistentStoreCoordinator *coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; // Add a readonly SQLite store NSError *err = nil; NSPersistentStore *store = [coord addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbURL options:@{NSReadOnlyPersistentStoreOption : @YES} error:&err]; if (store == nil) { // I get a Cocoa Error 260. NSLog(@"Error: %@", err); } 

创建一个新的,空的只读存储是没有意义的,您看到的结果正是预期的结果。 通过指定只读,您特别指出不应写入任何文件,因此结果….没有写入文件。

很难说出你想要完成的事情。 如果文件创建,您将无法使用它,因为它不包含任何数据,因为只读标志会阻止您添加任何数据。 空文件将非常有用。

但是,没有,没有办法告诉Core Data创建一个新的持久存储文件但是只读该文件,主要是因为这样的操作是荒谬和无用的。

如果你有理由想要一个既空又不可写的持久存储文件(如果你这样做,请分享),你需要

  1. 添加没有只读标志的持久存储
  2. 调用removePersistentStore:error:删除该持久性存储
  3. 使用只读标志再次添加持久存储。

您现在将拥有一个不包含任何数据的持久性存储,并且您无法将数据添加到该存储中。

一个同样有效的更简单的替代方法是首先不创建文件。 一个空的只读持久存储完全没有用处,所以简单的方法就是不打扰创建它。