【发布时间】:2015-07-06 12:34:19
【问题描述】:
我对 iOS 开发比较陌生,这是我第一次尝试使用 CoreData.framework。
我用“sqlitebrowser”创建了一个非常简单的数据库,并将它复制到我在 XCode 中的项目中。我可以看到该文件包含在应用程序包中。我尝试在AppDelegate 类中访问数据库,方法如下:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
//For now using the `SQLite` store generate manually. Make sure to open the
//store in read only mode since we cannot modify files in the bundle.
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"MatchWatcher" withExtension:@"sqlite"];
//Should be like below
NSDictionary *storeOptions = @{NSReadOnlyPersistentStoreOption:@YES, NSSQLitePragmasOption: @{@"journal_mode":@"DELETE"} };
// NSDictionary *storeOptions = @{NSSQLitePragmasOption: @{@"journal_mode" : @"DELETE"} };
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:storeOptions
error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
return _persistentStoreCoordinator;
}
如您所见,我尝试使用包含数据库只读打开的 storeOptions 变量,但这给了我以下异常:
2015-07-06 14:15:18.372 MatchWatcher[27495:3849154] CoreData: 错误:-addPersistentStoreWithType:SQLite 配置:(null) URL:file:///Users/john/Library/Developer/CoreSimulator/Devices /F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite 选项:{ NSReadOnlyPersistentStoreOption = 1; NSSQLitePragmasOption = { “journal_mode”=删除; }; } ...返回错误错误域= NSCocoaErrorDomain代码= 257“操作无法完成。(可可错误257。)” UserInfo = 0x7fa38a73cbb0 {NSUnderlyingException =无法在路径中创建具有只读选项的新数据库文件:/用户/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite}与userInfo字典{ NSUnderlyingException = "无法使用路径中的只读选项创建新的数据库文件:/Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15- 428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite”; } 2015-07-06 14:15:18.373 StockWatcher[27495:3849154] 未解决的错误错误域 = NSCocoaErrorDomain 代码 = 257“操作无法完成。(可可错误 257。)”用户信息 = 0x7fa38a73cbb0 {NSUnderlyingException = 无法创建新数据库文件,路径为只读选项:/Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15-428B-4356-BB2B- 066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite},{ NSUnderlyingException = "无法使用路径中的只读选项创建新的数据库文件:/Users/john/Library/Developer/CoreSimulator/Devices/F8C9B7DC-3C1D-495C-8FB6-80A9EA5976BB/data/Containers/Bundle/Application/CA64DE15- 428B-4356-BB2B-066258E5FBAE/MatchWatcher.app/MatchWatcher.sqlite”; }
对我做错了什么有任何想法吗?一些帮助将不胜感激!谢谢。
【问题讨论】:
-
正如错误消息所说:您设置了标志 NSReadOnlyPersistentStoreOption,但不想创建(=写入)数据库
-
我真的没有,我想打开一个已经存在的数据库文件,它存在于包中。 DB 文件中是否有任何特定内容应该存在以便能够使用 Xcode 打开它?我现在拥有的是一个非常简单的数据库,它有 1 个表,有 3 列(2 个 varchars 和 1 个浮点数)。
-
CoreData 不仅仅是一个简单的 sqlite 数据库。它创建具有特定名称的表。如果您真的想使用 CoreData,最好的方法是让 CoreData 创建一次表,然后编辑创建的数据库。如果只想使用自己的 sqlite 数据库,则不必使用 CoreData。存在(非常原始的)C 函数来读取和写入 sqlite 数据库(参见“sqlite3.h”),但也存在 Wrapper 类(例如 github.com/ccgus/fmdb),因此您不必编写 C 代码。
-
@freytag ,这有帮助,我将尝试使用辅助 OS X 添加创建数据库。
标签: ios objective-c sqlite core-data