2011-06-15 21 views
6

我有一个使用一个SQLite数据库来存储其数据模型的iOS应用。用户不能以任何方式更改此数据库的内容。数据库内容的唯一改变方式是在未来的应用程序更新中添加更多内容。 (应用程序永远不会将内容写入数据库,只能从数据库读取内容)如何覆盖一个SQLite数据库中的iOS应用程序时,一个新的版本发布

因此,当我执行此类更新时,我希望它在我正在创建的新版本中使用“较新”版本的数据库,并且以摆脱旧的数据库。什么是最好的方式去做这件事?是否有一种简单的方法可以告诉它在更新时抓取新版本的数据库,还是需要在自定义逻辑中进行编程?

回答

4

让我们从第一次安装应用程序开始讨论。 sqlite的DB将在流动的步骤是init:

  1. 检查是否在应用程序存在安装文件夹中的[APPNAME] .db的。

  2. 创建安装文件夹中的空[APPNAME] .db文件,如果这个文件不存在。

  3. 创建一个记录来表示当前的应用程序版本,并将其存储在一个名为“appversion”表(这也可以存储在首选项文件)。

  4. 负荷的位置,可以将其存储在步骤3中的旧版本号, 比较它的当前版本号,并且需要执行命名,如“[应用程序名称] _sql_v1.sql,[APPNAME薮SQL文件] _sql_v2.sql,[appname] _sql_v3.sql',请记住,每个版本都将拥有一个'[appname] _sql_v * .sql'文件,其中包含所有表架构更改并记录更改。如果您的应用程序已升级到版本7,您会在您的应用程序包中找到7个sql文件。

  5. 我们假设某人已经安装了版本为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.do没有把SQL语句初始化代码,把它放在一个SQL文件,并把它读作需要的SQLite数据库 。

2.每个版将拥有一个“[应用程序名称] _sql_v * .SQL”包含到透水版本所做的更改文件。

0

如果您使用DB从你的包(我假设你作为你的DB是只读的),那么你就自动使用DB的一个新版本的应用程序更新。如果您将数据库从数据包复制到文档文件夹,那么只需用新数据库重写旧数据库即可。

0

将预加载的数据库添加到您的项目(到Resources文件夹)。这将与您的应用程序一起部署,并且可以在运行时在主包路径中找到。

由于用户将永远不会写的内容,但从中只读的,你应该能够从那里直接打开它。你可以使用它的路径:

NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"ReadOnlyDatabase" ofType:@"sqlite"]; 
相关问题