我有一个iOS应用程序,它使用SQLite DB来存储其数据模型。用户无法以任何方式更改此DB的内容。数据库内容改变的唯一方法是在未来的应用更新中添加更多内容。 (应用程序永远不会将内容写入数据库,只能从中读取)
因此,当我执行这样的更新时,我希望它在我正在创建的新版本中使用数据库的“更新”版本,并且只是摆脱旧数据库。最好的方法是什么?有一种简单的方法可以告诉它在我更新时抓住新版本的数据库,还是需要为自定义逻辑编程呢?
答案 0 :(得分:4)
让我们首次安装您的应用程序的开头。 sqlite db将在流程中执行init:
检查应用安装文件夹中是否存在[appname] .db。
如果此文件不存在,请在安装文件夹中创建一个空的[appname] .db文件。
创建一条记录以指示当前的应用版本并将其存储在名为“appversion”的表中(这也可以存储在首选项文件中)。
在步骤3中从您存储旧版本号的位置加载旧版本号, 将它与当前版本号进行比较,你需要执行名为'[appname] _sql_v1.sql,[appname] _sql_v2.sql,[appname] _sql_v3.sql'的serval sql文件,请记住,每个版本都会拥有一个'[appname] _sql_v * .sql'文件,其中包含所有表架构更改和记录更改。如果您的应用程序已升级到版本7,您将在应用程序包中找到7个sql文件。
让我们假设某个人安装了版本为2的应用程序,但直到有一天他/她发现当前版本为7,然后他/她将其升级为7时才更新。两个代码版本号将会在他/她在升级完成后第一次启动应用程序时加载:2和7,所以这些sql文件:[appname] _sql_v3.sql,[appname] _sql_v4.sql,[appname] _sql_v5.sql,[appname ] _sql_v6.sql,[appname] _sql_v7.sql将逐个执行。
记住这些事情:
1.不要将sql init语句放在代码中,将其放在sql文件中并将其读取到sqlite db 根据需要。
2.每个版本将拥有一个'[appname] _sql_v * .sql'文件,其中包含对以前版本所做的更改。
答案 1 :(得分:0)
如果您使用捆绑包中的数据库(我假设您这样做,因为您的数据库是只读的),那么您会自动使用新版本的数据库进行应用更新。如果将数据库从软件包复制到文档文件夹,则只需用新软件重写旧数据库。
答案 2 :(得分:0)
将预加载的数据库添加到项目中(到Resources文件夹)。这将与您的应用程序一起部署,并且可以在运行时在主程序包路径中找到。
由于用户永远不会向其中写入内容但只能从中读取内容,因此您应该可以直接从中打开内容。您可以使用以下方式获取它的路径:
NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"ReadOnlyDatabase" ofType:@"sqlite"];