我正在设计一个最近的应用程序中包含一个SQLite数据库。这将位于应用程序文件夹中,并将包含库存和用户数据。它是通过.net和实体框架开发的。
我想知道如何在应用程序更新(例如添加表和字段)之间更新此数据库,同时还要在用户更新应用程序时保留客户端的用户数据。我假设如果我只是更改数据库架构和数据开发方面,然后在更新时覆盖到客户端.db文件,那么您将丢失所有用户数据。
有什么建议吗?
答案 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
(保留现有数据,如果提供的话,将使用默认值)。
限制是:-
- 该列可能没有PRIMARY KEY或UNIQUE约束。
- 该列的默认值不能为CURRENT_TIME,CURRENT_DATE,CURRENT_TIMESTAMP或括号中的表达式。
- 如果指定了NOT NULL约束,则该列必须具有非NULL的默认值。
如果启用了外键约束,并且添加了具有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
P.S。问最佳可能会导致基于意见的回应,有时会引起激烈的争论,因此应避免要求最佳。宁可问路。