无法从 iOS 应用程序打开 sqlite DB

Posted

技术标签:

【中文标题】无法从 iOS 应用程序打开 sqlite DB【英文标题】:Can't open sqlite DB from iOS app 【发布时间】: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 添加创建数据库。 【参考方案1】:

Core Data 使用的 SQLite 文件是以封闭方式构建的。它不适用于您在 Core Data 之外开发的 SQLite 文件。

Core Data 旨在成为您的应用程序的模型。将其视为关系数据库工具会给您带来问题。将它用作应用程序的模型,然后让它持久保存到磁盘。反之亦然。

【讨论】:

感谢 Marcus,您的回答与 @freytag 的回答类似,我将使用辅助 OS X 应用程序创建数据库。

以上是关于无法从 iOS 应用程序打开 sqlite DB的主要内容,如果未能解决你的问题,请参考以下文章

Cordova Android:从任意目录打开 SQLite .db 数据库

无法使用带有两个按钮的烧瓶从 sqlite db 中删除记录

将 sqlite3 db 关联到 iPhone 应用程序

无法打开在 Android 中创建的 SQLite DB(文件已加密或不是数据库)

Sqlite3 数据库表无法在 XCode 4.2 中打开

为啥我无法从 fireac 打开我的 sqlite 数据库?