我有一个数据库,用户只能读取和更新他的表。
我不知道如何在不丢失用户数据的情况下向表中添加新记录并将更新后的数据库加载到应用程序的文档文件夹中。
示例:包含2个表的数据库:
表A,用户在其中插入和更新数据
表B是一个数据源,用户只能在其中读取。
现在我想在表B中添加一些新记录,并将更新后的数据库上传到应用程序中,而不会丢失表A中存储的数据。
顺便说一句,数据库不会被复制,因为旧版本已经存储在Documents文件夹中。
如何做到这一点?
一些可能的考虑因素:
-
系统发布之间的定期数据更新
如果你说的是确保应用程序可以定期(即在应用程序发布之间(接收表B的更新,那么你可能想设计一个web服务来检索更新。如果表B不是太大,那么设计一个web服务,以某种不错的格式检索B的全部内容(例如JSON非常适合(,然后编写代码联系web服务,请求这些数据,然后将其集成到数据库的本地副本中(。如果B很大,您可能希望设计一个只检索任何创建、删除或更新事务的web服务。
如果你以前没有这样做过,我可能会推荐你参考Wenderlich的《如何为iOS应用程序编写简单的PHP/MySQLWeb服务》及其配套文章《如何编写使用Web服务的iOS应用程序》。
-
发布新版本的应用程序时迁移数据库
另一方面,如果您正在讨论发布新版本的应用程序,但又不想丢失表a中的客户信息,则可以同时打开两个数据库(打开文档数据库,然后使用
ATTACH DATABASE
命令在同一个sqlite3
会话中同时打开另一个(,然后使用SQL轻松地将数据从一个数据库复制到另一个数据库。例如,打开新的系统数据库(具有更新的表B(,并连接到具有表A中更新的用户数据的数据库:NSString *sql = [NSString stringWithFormat:@"ATTACH DATABASE "%@" AS user_db", customerDbPath];
然后,您可以从
user_db
数据库重新填充userdata
(表A(:DELETE FROM userdata; INSERT INTO userdata SELECT * FROM user_db.userdata
如果您正在进行这种"数据库迁移"(将表B的系统更新与表A的用户更新集成在一起(,您可能希望使用某种控制机制,通过该机制,系统可以快速比较两个数据库,并确保您知道您正在处理表B的同一格式副本。为此,您可以使用
PRAGMA user_version
,或者我个人通常有自己的configuration
表,我在其中保存一般配置信息,并且我总是有一个版本号。 -
分开的数据库
最后一个考虑因素是,您可能会考虑为这两个表建立单独的数据库。这通常不是正确的方法,但如果两个表之间几乎没有交互,并且它们是完全不同类型的数据,那么这是另一种需要考虑的方法。