【问题标题】:Unable to create a readonly sqlite store in Core Data: Cocoa Error 260无法在 Core Data 中创建只读 sqlite 存储:Cocoa 错误 260
【发布时间】:2015-02-14 18:08:57
【问题描述】:

我正在尝试使用只读选项 (NSReadOnlyPersistentStoreOption) 创建一个 NSSQLiteStoreType。如果 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);
}

【问题讨论】:

  • 对不起,如果我是钝的,但是你为什么要一个全新的、空的商店是只读的?抛开这些不谈,您能否以读/写方式打开它、关闭它,然后以只读方式重新打开它?

标签: ios objective-c sqlite cocoa core-data


【解决方案1】:

创建一个新的、空的、只读的存储是没有意义的,而您看到的结果正是预期的结果。通过指定只读,您明确表示不应写入任何文件,因此结果......没有文件被写入。

很难说你想要完成什么。如果创建了文件,您将无法使用它,因为它不包含任何数据,而且只读标志会阻止您添加任何数据。空文件同样有用。

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

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

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

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

一个同样有效的更简单的替代方法是不首先创建文件。一个空的只读持久存储实际上根本没有任何用途,所以简单的方法就是不要费心创建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2013-10-27
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多