如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?

Posted

技术标签:

【中文标题】如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?【英文标题】:How to put a pre-existing sqlite file into <Application_Home>/Library/? 【发布时间】:2012-11-11 21:34:19 【问题描述】:

我的应用使用核心数据。我已经在成功创建并填充了相应的 sqlite 文件的模拟器中运行了该应用程序。我现在想将这个预先存在的 sqlite 文件放到实际设备上,并成为我应用程序的一部分。我在 /Library/Application Support/iPhone Simulator/6.0/Applications/identifier/Documents/myapp.sqlite 找到了模拟器生成的 sqlite 文件并将其拖到 Xcode 中。这已将其添加到我的应用程序包中,但不在适当的目录中(结果是可以读取 sqlite 文件但不能写入)。

通过阅读有关文件系统的信息,我相信放置 sqlite 文件的最佳位置是在 Application_Home/Library/ 下的自定义目录“数据库”中。我似乎无法在 Xcode 中执行此操作,尽管进行了搜索,但我无法弄清楚如何执行以下操作:

(1) 在 Application_Home/Library/ 中创建一个名为“Database”的子目录? (2) 将sqlite文件转移到我新创建的'Database'目录下?

非常感谢@Daij-Djan 在下面的回答。

另一个问题: sqlite 文件的路径将由持久存储协调器使用。现在根据 sqlite 文件的大小,复制或移动可能需要一段时间。如何确保@Daij-Djan 提供的示例代码在持久存储协调器尝试引用 sqlite 文件之前已执行并完成?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

模拟代码

在 appDidFinishLaunching.. 也许

dbpath = PATH_YOU_WANT
if(!file.exists_at:dbpath) 
    copy(dbinbundle, dbpath);

在 objC 中: (内嵌,可能出现拼写错误)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

    NSString *lib = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbs = [lib stringByAppendingPathComponent:@"Database"];
    NSString *file = [dbs stringByAppendingPathComponent:@"db.sqlite"];
    if(![[NSFileManager defaultManager] fileExistsAtPath:file]) 

        id dbInBundle = [[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"];

        [[NSFileManager defaultManager] createDirectoryAtPath:dbs withIntermediateDirectories:YES attributes:nil error:nil];
        [[NSFileManager defaultManager] copyItemAtPath:dbInBundle toPath:file error:nil];
    
    ....

【讨论】:

如果 OP 不知道如何在 Library 中创建子目录以及如何在其中复制默认数据库,那么此伪代码可能无济于事。 大家好!非常感谢。我是 ios 新手。我已经开始从添加的伪代码中研究它。我以为我可以在 Xcode 中完成它,但没有意识到它必须以编程方式完成。另一件事:持久存储协调器将使用 sqlite 文件的路径。现在根据 sqlite 文件的大小,复制或移动可能需要一段时间。在持久存储协调器尝试引用 sqlite 文件之前,如何确保上述示例代码已执行并完成? 在将商店添加到 PST 之前执行此操作。 -> 将代码放在加载 PST 的代码之前 我明白了。我不确定的是:代码执行是否等到对 copyItemAtPath 的调用成功完成后再执行更多代码?如果不是并且 sqlite 文件很大,那么我相信将存储添加到 PST 的调用是可以想象的,即使它是在调用 copyItemAtPAth 之后进行的,仍然可能在复制完全完成之前发生。谢谢。

以上是关于如何将预先存在的 sqlite 文件放入 <Application_Home>/Library/?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Sqlite 数据库文件复制/放入设备以在其上测试应用程序 - Xcode

无法将 SQLite 数据库从资产文件夹复制到设备内存

如何将按钮添加到功能区(C#)上预先存在的选项卡?

高级安装程序如何将变量实例名放入 EXE 引导程序中,以便预先安装 SQL Express 2012

java [iOS]复制预先填充的SQLite文件

Listview和复选框(如何放入数据库(sqlite))