【问题标题】:Refresh Database On iPhone在 iPhone 上刷新数据库
【发布时间】:2009-11-28 23:25:09
【问题描述】:

我正在尝试将我的 sqlite db 的更新版本推送到我的设备上,但到目前为止,除了每次都重命名它(痛苦)之外,我还没有想出办法来做到这一点。陈旧的(缓存的?)副本永久保留在设备上。

我了解如何通过清除 /applications 文件夹将更新版本导入模拟器,但这似乎不会影响物理设备。

建议?

【问题讨论】:

    标签: iphone database refresh


    【解决方案1】:

    如果数据库文件是您的应用程序包的一部分,当您更新应用程序时,您将更新数据库。

    如果数据库不是应用程序包的一部分,而是在读写空间(如文档目录)中,您需要实施自己的策略。

    我在我的数据库中包含一个 schema_version 表:

    create table schema_version (
      version integer not null
    );
    

    然后在应用程序启动时,我检查当前版本,然后在我的应用程序目录中查找 update-schema-[N+1].sql 文件以应用为更新。因此,如果我的架构版本是 4,我将检查 update-schema-5.sql 等(我会根据需要重复此操作,直到我用完要应用的 update-schema-N.sql 文件。)

    请注意,sqlite 在 iphone 上的写入性能并不是那么好。如果您需要更新 200K 数据库行,您可能需要想办法让用户在更新过程中保持愉悦。

    我的应用使用混合方法,我们将大部分 (60 MB) 数据存储在只读数据库中,而较小的读写数据库用于用户贡献和缓存的内容。

    【讨论】:

    • 完美!当您想将新版本的数据库推送到本地物理测试设备(iphone / ipod touch)时,最简单的方法是什么?我每次都在重命名我的数据库,这会强制选择/使用新版本。
    • 更新数据库后我 Build:Clean ([shift-command-k])。
    【解决方案2】:

    您可以编写一个 OS X 命令行应用程序来“区分”旧数据库和新数据库。然后向设备发送所有添加、删除和更新的 JSON 对象(或 XML),并将它们应用到现有存储。

    您还可以在应用程序首次运行时将您的商店复制到 Documents 文件夹并从那里读取。 Documents 文件夹具有读/写/删除权限,因此我认为您可以将新文件夹放入其中。您可以像这样获得该路径。

    NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory,
                NSUserDomainMask,
                YES);
    
    NSString *docDir = [arrayPaths objectAtIndex:0];
    

    【讨论】:

    • 我想这可以工作,但听起来比重命名要多。 :) 您如何处理将应用程序的新版本发布到应用商店并且需要进行架构更改的情况?
    • 我认为如果您必须进行架构更改,它不会起作用。那还没有出现在我身上。我认为您可以将存储写入文件文件夹,该文件夹位于捆绑包之外并具有读/写访问权限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多