【发布时间】:2009-11-28 23:25:09
【问题描述】:
我正在尝试将我的 sqlite db 的更新版本推送到我的设备上,但到目前为止,除了每次都重命名它(痛苦)之外,我还没有想出办法来做到这一点。陈旧的(缓存的?)副本永久保留在设备上。
我了解如何通过清除 /applications 文件夹将更新版本导入模拟器,但这似乎不会影响物理设备。
建议?
【问题讨论】:
我正在尝试将我的 sqlite db 的更新版本推送到我的设备上,但到目前为止,除了每次都重命名它(痛苦)之外,我还没有想出办法来做到这一点。陈旧的(缓存的?)副本永久保留在设备上。
我了解如何通过清除 /applications 文件夹将更新版本导入模拟器,但这似乎不会影响物理设备。
建议?
【问题讨论】:
如果数据库文件是您的应用程序包的一部分,当您更新应用程序时,您将更新数据库。
如果数据库不是应用程序包的一部分,而是在读写空间(如文档目录)中,您需要实施自己的策略。
我在我的数据库中包含一个 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) 数据存储在只读数据库中,而较小的读写数据库用于用户贡献和缓存的内容。
【讨论】:
您可以编写一个 OS X 命令行应用程序来“区分”旧数据库和新数据库。然后向设备发送所有添加、删除和更新的 JSON 对象(或 XML),并将它们应用到现有存储。
您还可以在应用程序首次运行时将您的商店复制到 Documents 文件夹并从那里读取。 Documents 文件夹具有读/写/删除权限,因此我认为您可以将新文件夹放入其中。您可以像这样获得该路径。
NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *docDir = [arrayPaths objectAtIndex:0];
【讨论】: