【发布时间】: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