sti*_*ler 3 .net sqlite entity-framework
我在最近设计的应用程序中包含了一个 SQLite 数据库。这将位于应用程序文件夹中,并将包含股票和用户数据的混合。它是通过.net 和实体框架开发的。
我想知道如何在应用程序更新之间更新此数据库(例如添加表和字段),同时在用户更新应用程序时保留用户数据客户端。我假设如果我只是更改数据库模式和数据开发端,然后在更新时覆盖到客户端 .db 文件,那么您将丢失所有用户数据。
有什么建议么?
您基本上需要将实时数据库中的内容与新数据库中的内容进行比较。
例如,如果添加一个表,那么您可以用来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 子句的列,则该列必须具有默认值 NULL。
- 另请注意,添加 CHECK 约束时,不会针对表中预先存在的行测试 CHECK 约束。这可能会导致表中包含违反 CHECK 约束的数据。SQLite 的未来版本可能会更改以在添加 CHECK 约束时对其进行验证。
如果该列已存在,则结果将包含一条消息,指出该列是重复的,例如:-
ALTER TABLE ex01 ADD COLUMN col5 TEXT
> duplicate column name: col5
> Time: 0s
Run Code Online (Sandbox Code Playgroud)
您始终可以使用提取现有列,PRAGMA table_info(your_existing_table_name);并且仅当要添加的列不是结果集名称列中的值之一时才继续。
对于 Android,库存 SQLiteDatabase 方法利用user_version(数据库标头中的字节 60 63)来保存与提供的值进行比较的数据库的实际版本。如果提供的值更大,则调用 onUpgrade 方法。
PS 要求最好可能会导致基于意见的回应,有时会引起激烈的争论,因此应该避免要求最好。而是求方法。