在软件更新中更新sqlite模式和数据的最佳方法是什么?

时间:2018-11-19 22:44:15

标签: .net entity-framework sqlite

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

例如如果添加表,则可以使用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.   
  3. 该列的默认值不能为CURRENT_TIME,CURRENT_DATE,CURRENT_TIMESTAMP或括号中的表达式。
  4.   
  5. 如果指定了NOT NULL约束,则该列必须具有非NULL的默认值。
  6.   
  7. 如果启用了外键约束,并且添加了具有REFERENCES子句的列,则该列的默认值必须为   空。

         
        
    • 还请注意,在添加CHECK约束时,不会针对表的现有行测试CHECK约束。这可能导致表中包含违反CHECK约束的数据。将来的SQLite版本可能会更改,以在添加时验证CHECK约束。
    •   
  8.   

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

P.S。问最佳可能会导致基于意见的回应,有时会引起激烈的争论,因此应避免要求最佳。宁可问路。