【问题标题】:What is the best way to update sqlite schema and data on a software update?在软件更新中更新 sqlite 架构和数据的最佳方法是什么?
【发布时间】:2018-11-19 22:44:14
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 您提到您正在使用实体框架,EF 具有“迁移”功能,可让您保持目标数据库同步并具有更改历史记录。

标签: .net entity-framework sqlite


【解决方案1】:

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

例如如果添加一个表,那么您可以使用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 子句的列,则该列必须具有默认值 空。

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

SQL As Understood By SQLite - ALTER TABLE

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

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

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

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

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

PRAGMA Statements Database File Format

附注问最佳可能会导致基于意见的回应,有时会引起激烈的争论,因此应该避免要求最佳。不如问路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多