首页 > 解决方案 > 在软件更新中更新 sqlite 架构和数据的最佳方法是什么?

问题描述

我在最近设计的一个应用程序中包含了一个 SQLite 数据库。这将位于应用程序文件夹中,并将包含股票和用户数据的混合。它是通过 .net 和实体框架开发的。

我想知道如何在应用程序更新之间更新这个数据库(比如添加表和字段),同时在用户更新应用程序时在客户端保留用户数据。我假设如果我只是更改数据库架构和数据开发端,然后在更新时覆盖到客户端 .db 文件,那么您将丢失所有用户数据。

有什么建议么?

标签: .netentity-frameworksqlite

解决方案


您基本上需要在实时数据库中与新数据库进行比较。

例如,如果添加一个表,那么您可以使用SELECT * FROM sqlite_master WHERE name = your_new_table_name该表来查看该表是否已经存在。但是你可以使用更简单的CREATE TABLE IF NOT EXISTS ........

您可以使用具有限制的新列ALTER TABLE your_existing_tablename ADD COLUMN you_new_column_definition(保留现有数据,如果提供默认值将应用)。

限制是:-

  1. 该列可能没有 PRIMARY KEY 或 UNIQUE 约束。
  2. 该列可能没有默认值 CURRENT_TIME、CURRENT_DATE、CURRENT_TIMESTAMP 或括号中的表达式。
  3. 如果指定了 NOT NULL 约束,则该列必须具有除 NULL 之外的默认值。
  4. 如果启用了外键约束并添加了带有 REFERENCES 子句的列,则该列的默认值必须为 NULL。

    • 另请注意,在添加 CHECK 约束时,不会针对表中预先存在的行测试 CHECK 约束。这可能会导致包含违反 CHECK 约束的数据的表。SQLite 的未来版本可能会更改以在添加 CHECK 约束时对其进行验证。

SQLite 理解的 SQL - ALTER TABLE

如果该列已存在,则结果将包含一条消息,指出该列是重复的,例如:-

ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s

您始终可以使用提取现有列,PRAGMA table_info(your_existing_table_name);并且仅在要添加的列不是结果集的名称列中的值之一时才继续。

  • 请注意,上面的链接建议了处理更复杂情况的其他方法。

在 Android 中,常用的 SQLiteDatabase 方法利用user_version(数据库标头中的字节 60 63)来保存与提供的值进行比较的数据库的实际版本。如果提供的值更大,则调用 onUpgrade 方法。

PRAGMA 语句 数据库文件格式

PS Asking Best可能会导致基于意见的回应,有时会引起激烈的争论,因此应该避免要求 Best。而是寻求方法。


推荐阅读