答案 0 :(得分:3)
您可以在NSUserDefaults
中设置布尔值 - NSUserDefaults
仅在用户删除应用时重置,因此如果在用户默认值中找不到特定的布尔值,则会执行一些代码(然后在执行后保存该值以防止再次运行)。
这将涵盖您的普通“运行代码一次安装”方案 - 您可以使用类似的方法实现相同的更新,但使用CFBundleVersion
变量(对于您的应用的每个版本,这将是不同的)
答案 1 :(得分:1)
首先,您可能不想考虑在升级期间执行某些操作,因为这是不可能的。与@lxt建议一样,您可以在首选项中存储一个值以指示数据库版本,但它可能不是防弹的。
解决此问题的常用方法是使用自建的元数据。首次创建数据库时,应创建一个名为"metadata"
或"properties"
的额外表,其中包含两个varchar列"name"
和"value"
。您插入一行("database_ver", "1")
。
在数据库层(或适配器)类中,创建一个“open”方法来处理打开。在此方法中,首先运行select database_ver from metadata;
以检查数据库版本。如果未提取任何内容,则运行表创建脚本,并插入database_ver = 1行。
稍后,如果您升级了表格格式,请为每个版本提供alter table
语句,然后根据database_ver
运行它们。对于升级后的安装,您可以使用更新的create table
语句,然后直接将"database_ver"
设置为"2"
(或更高版本),而无需通过alter table
。
与在首选项中存储值相比,将数据存储在数据库本身更为常见。因为即使用户在某处备份了文件,或者跳过了某个版本,您仍然可以通过其元数据表来告诉数据库的格式。
FMDB运行这种机制没有问题。