【问题标题】:How to put a pre-existing sqlite file into <Application_Home>/Library/?如何将预先存在的 sqlite 文件放入 <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 文件之前已执行并完成?

提前感谢您的帮助。

【问题讨论】:

    标签: ios sqlite core-data ios-simulator


    【解决方案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 之后进行的,仍然可能在复制完全完成之前发生。谢谢。
    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多