【发布时间】:2012-03-24 20:00:49
【问题描述】:
【问题讨论】:
标签: iphone objective-c ios database
【问题讨论】:
标签: iphone objective-c ios database
您可以在 NSUserDefaults 中设置布尔值 - NSUserDefaults 仅在用户删除应用程序时重置,因此如果在用户默认值中找不到特定的布尔值(然后保存执行后的那个值,以防止它再次运行)。
这将涵盖您简单的“安装后运行代码”场景 - 您可以使用类似的方法实现相同的更新,但使用 CFBundleVersion 变量(对于您的每个版本的应用程序会有所不同)。
【讨论】:
首先,您可能不想考虑在升级期间执行某些操作,因为这是不可能的。就像@lxt 建议的那样,您可以在首选项中存储一个值来指示数据库版本,但它可能不是防弹的。
解决此问题的常用方法是使用自建元数据。首次创建数据库时,应创建一个名为 "metadata" 或 "properties" 的额外表,其中包含两个 varchar 列,"name" 和 "value"。你插入一行,("database_ver", "1")。
在您的数据库层(或适配器)类中,您创建一个“打开”方法来处理打开。在此方法中,您首先运行select database_ver from metadata; 来检查数据库版本。如果没有获取任何内容,则运行表创建脚本,并插入 database_ver=1 行。
以后如果您升级了表格格式,请为每个版本提供alter table 语句,并根据database_ver 运行它们。对于升级后的安装,可以使用更新后的create table语句,然后直接将"database_ver"设置为"2"(或以上),无需经过alter table。
与将值存储在首选项中相比,将其存储在数据库本身中实际上更为常见。因为即使用户在某个地方备份了文件,或者跳过了一个版本,您仍然可以通过元数据表来判断数据库的格式。
FMDB 运行这种机制没有问题。
【讨论】: