【问题标题】:iOS - Create Database Schema (Run code only once)iOS - 创建数据库模式(只运行一次代码)
【发布时间】:2012-03-24 20:00:49
【问题描述】:

我将FMDB 用于我的 iPhone 应用程序数据库,我只想创建一次数据库和表架构。

当用户安装或更新应用程序时,我如何运行 OBJC 代码?

问候

【问题讨论】:

    标签: iphone objective-c ios database


    【解决方案1】:

    您可以在 NSUserDefaults 中设置布尔值 - NSUserDefaults 仅在用户删除应用程序时重置,因此如果在用户默认值中找不到特定的布尔值(然后保存执行后的那个值,以防止它再次运行)。

    这将涵盖您简单的“安装后运行代码”场景 - 您可以使用类似的方法实现相同的更新,但使用 CFBundleVersion 变量(对于您的每个版本的应用程序会有所不同)。

    【讨论】:

      【解决方案2】:

      首先,您可能不想考虑在升级期间执行某些操作,因为这是不可能的。就像@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 运行这种机制没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        相关资源
        最近更新 更多