gpt4 book ai didi

android - 困惑 : How does SQLiteOpenHelper onUpgrade() behave? 并与旧数据库备份一起导入?

转载 作者:IT老高 更新时间:2023-10-28 22:01:45 27 4
gpt4 key购买 nike

假设我在 SQLiteOpenHelper 中有一个包含 2 列的数据库表 test_table 和相应的创建脚本:

DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}

这是在 Play 商店中发布的初始应用版本 1。

一段时间后,应用程序和使用的数据库会更新。我猜 SQLiteOpenHelper 类必须像这样调整:

DB_VERSION = 2:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C)");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}

一段时间后,另一个应用更新:

DB_VERSION = 3:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C, COL_D)");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}

--> 这就是我需要建议的地方。如果用户安装应用程序版本 1,则他有 A 列和 B 列。如果他随后更新到版本 2,onUpgrade 会触发并添加 C 列。从头开始安装的新用户通过 create 语句获得 3 列。如果用户随后更新到版本 3,onUpgrade 将再次触发并添加列 D。但是,如果用户安装应用程序版本 1,然后跳过版本 2 的更新并更新版本 3,该怎么办?那他就错过了

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}

只有一部分

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}

会被调用,这会导致一个表 test_table(COL_A, COL_B, COL_D)??

处理实时应用程序的数据库升级的正确方法是什么,这样用户就不会丢失他的数据?是否必须在 onUpgrade() 方法中检查所有可能的(旧)版本并根据该版本执行不同的 alter table 语句?

我问是因为在我的应用程序中,用户可以导出和导入数据,这无非是导出:复制整个数据库并导入:将应用程序数据库替换为备份副本数据库。

如果用户拥有应用程序版本 1,导出数据库,升级应用程序(新数据库结构)并导入旧版本 1 备份,会发生什么情况?--> SQLiteOpenHelper 将如何表现?--> 处理数据库升级和导入/导出功能的正确方法是什么?

最佳答案

What's the correct way of handling database upgrades of a live app, so the user doesn't lose his data? Do you have to check all possible (old) versions in the onUpgrade() method and execute different alter table statements based on that version?

总的来说,是的。

一种常见的方法是进行成对升级:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion<2) {
// do upgrade from 1 to 2
}

if (oldVersion<3) {
// do upgrade from 2 to 3, which will also cover 1->3,
// since you just upgraded 1->2
}

// and so on
}

这大致相当于 Rails 迁移,例如。

What happens if the user has app version 1, exports the database, upgrades the app (new database structure) and imports the old version 1 backup? --> How will SQLiteOpenHelper behave?

如果“复制整个数据库”,您的字面意思是 SQLite 数据库文件的完整文件副本,那么当 SQLiteOpenHelper 去打开恢复的备份时,数据库将具有旧架构版本,将正常通过 onUpgrade()

What is the correct way to handle db upgrades together with import/export functionality?

我怀疑答案是:要么通过复制整个文件来进行备份,要么还安排备份和恢复架构版本,您可以通过在 上调用 getVersion() 来获得>SQLiteDatabase 对象。话虽如此,我还没有过多地处理这种情况,可能还有更多我没有想到的问题。

关于android - 困惑 : How does SQLiteOpenHelper onUpgrade() behave? 并与旧数据库备份一起导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14419358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com