如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1

Posted

技术标签:

【中文标题】如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1【英文标题】:How to import a pre-existing sqlite file into core data iOS 7.1 【发布时间】:2014-04-17 19:00:01 【问题描述】:

我创建了一个新的核心数据项目并设置了我的核心数据模型。然后我在模拟器中运行它,然后保存上下文。然后我使用 Core Data Editor 5 打开并查看我的数据库。我添加并编辑了新的授权,保存了文件,然后我进入模拟器检查它是否有效,并且所有内容都已添加并且看起来很好。我现在想将此数据库添加到我的项目包中,并让应用程序将此 bata 库加载为其默认核心数据库。有了新的 wal 系统,我似乎无法让它工作。我想知道是否有人知道如何解决它。我听说你必须添加所有 3 个文件(.sqlite、wal、shm),但我不知道具体保存在哪里或通过什么过程来完成。

【问题讨论】:

【参考方案1】:

将这三个都作为资源添加到您的 ios 应用程序中。那么

NSURL *storeURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"myfilename" ofType:@"myfileextension"]];

并在对-addPersistentStoreWithType:configuration:...的调用中将其传递给您的NSPersistentStoreCoordinator

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

    if (_persistentStoreCoordinator != nil) 
        return _persistentStoreCoordinator;
    

    NSURL *storeURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"myfilename" ofType:@"myfileextension"]];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:storeURL
                                                         options:@NSReadOnlyPersistentStoreOption : @YES,
                                                                   NSSQLitePragmasOption: @ @"journal_mode" : @"WAL"
                                                           error:&error]) 
        /*
         Replace this implementation with code to handle the error appropriately.
        */

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    

    return _persistentStoreCoordinator;

虽然给了你那个 sn-p,但我不是这样做的,我不知道它会起作用。相反,如果我正在创建一个静态数据存储以用作只读数据,当我创建数据存储(在另一个工具或程序中)以及在我的实际 iOS 应用程序中读取它时,我将使用旧的 DELETE 日志模式。这意味着更改options: 参数(在创建代码和读取代码上)。

              options:@NSReadOnlyPersistentStoreOption : @YES,
                        NSSQLitePragmasOption: @ @"journal_mode" : @"DELETE"

http://www.sqlite.org/draft/wal.html 声明“无法打开只读 WAL 数据库。”进一步讨论http://www.sqlite.org/draft/wal.html#readonly。

【讨论】:

以上是关于如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1的主要内容,如果未能解决你的问题,请参考以下文章

如何用应用商店中的新版本替换 iOS 应用中预先填充的核心数据?

如何将预先存在的 python 项目导入 Eclipse?

Iphone 编程 - 将现有的 sql 表导入到 sqlite 或核心数据

如何在 sqlite 核心数据文件之间正确切换?

如何使用 XCode 菜单而不是以编程方式将我的 sqlite 文件从文档目录复制到应用程序包

从文本文件导入数据时向预先存在的字典键添加值(Python 3)