Iphone iOS-创建数据库架构(仅运行一次代码)
我正在为我的iPhone应用程序数据库使用,我只想创建一次数据库和表模式 当用户安装或更新应用程序时,如何运行OBJC代码Iphone iOS-创建数据库架构(仅运行一次代码),iphone,objective-c,ios,database,Iphone,Objective C,Ios,Database,我正在为我的iPhone应用程序数据库使用,我只想创建一次数据库和表模式 当用户安装或更新应用程序时,如何运行OBJC代码 您可以在NSUserDefaults中设置一个布尔值-NSUserDefaults仅在用户删除应用程序时重置,因此,如果在用户默认值中找不到特定的布尔值,您可以执行一些代码(然后在执行后保存该值,以防止再次运行该值) 这将涵盖您的普通“安装后立即运行代码”场景-您可以通过类似的方法实现相同的更新,但使用CbundLeverVersion变量(对于您的应用程序的每个版本,这将
您可以在
NSUserDefaults
中设置一个布尔值-NSUserDefaults
仅在用户删除应用程序时重置,因此,如果在用户默认值中找不到特定的布尔值,您可以执行一些代码(然后在执行后保存该值,以防止再次运行该值)
这将涵盖您的普通“安装后立即运行代码”场景-您可以通过类似的方法实现相同的更新,但使用
CbundLeverVersion
变量(对于您的应用程序的每个版本,这将是不同的).您可以在NSUserDefaults
中设置布尔值-NSUserDefaults
仅在用户删除应用程序时重置,因此,如果在用户默认值中找不到特定的布尔值,您可以执行一些代码(然后在执行后保存该值以防止再次运行)
这将涵盖您的普通“安装后立即运行代码”场景-您可以通过类似的方法实现相同的更新,但使用
CbundLeverVersion
变量(这对于您的应用程序的每个版本都不同)。首先,您可能不想在升级过程中考虑执行某些操作,因为这是不可能的。就像@lxt建议的那样,您可以在首选项中存储一个值来指示数据库版本,但它可能不是防弹的
解决此问题的常用方法是使用自建元数据。首次创建数据库时,应创建一个名为“metadata”
或“properties”
的额外表,其中包含两个varchar列,“name”
和“value”
。插入一行,(“数据库版本”,“1”)
在数据库层(或适配器)类中,创建一个“open”方法来处理打开。在此方法中,首先运行select database\u ver from metadata
检查数据库版本。如果未提取任何内容,则运行表创建脚本,并插入数据库\u ver=1行
稍后,如果您升级了表格格式,请为每个版本提供altertable
语句,并基于database\u ver
运行它们。对于升级后的安装,您可以使用更新的create table
语句,然后直接将“database\u ver”
设置为“2”
(或更高版本),而无需执行alter table
与在首选项中存储值相比,实际上更常见的做法是将其存储在数据库中。因为即使用户在某个地方备份了文件,或者跳过了某个版本,您仍然可以通过其元数据表来判断数据库的格式
FMDB运行这种机制没有问题。首先,您可能不想在升级过程中考虑执行某些操作,因为这是不可能的。就像@lxt建议的那样,您可以在首选项中存储一个值来指示数据库版本,但它可能不是防弹的 解决此问题的常用方法是使用自建元数据。首次创建数据库时,应创建一个名为
“metadata”
或“properties”
的额外表,其中包含两个varchar列,“name”
和“value”
。插入一行,(“数据库版本”,“1”)
在数据库层(或适配器)类中,创建一个“open”方法来处理打开。在此方法中,首先运行select database\u ver from metadata
检查数据库版本。如果未提取任何内容,则运行表创建脚本,并插入数据库\u ver=1行
稍后,如果您升级了表格格式,请为每个版本提供altertable
语句,并基于database\u ver
运行它们。对于升级后的安装,您可以使用更新的create table
语句,然后直接将“database\u ver”
设置为“2”
(或更高版本),而无需执行alter table
与在首选项中存储值相比,实际上更常见的做法是将其存储在数据库中。因为即使用户在某个地方备份了文件,或者跳过了某个版本,您仍然可以通过其元数据表来判断数据库的格式
FMDB运行这种机制没有问题