gpt4 book ai didi

android - 升级具有多个表的Android应用程序数据(不破坏未受影响的表)

转载 作者:太空狗 更新时间:2023-10-29 13:39:26 24 4
gpt4 key购买 nike

在我的 Android 应用程序中;我有一个包含多个表的数据库。每个表或多或少彼此分开,但认为(为了最佳实践?)只有一个数据库文件。

在升级方面,目前是一个孤注一掷的问题。在升级时,它“删除”所有表并重新创建它们。但是,如果只有一个表发生更改,这会相当苛刻,因为所有其他表的数据也会丢失。

是否有一种内置方法可以仅自动升级已更改的表?(例如,使用每个/表的版本号?)

如果没有,我想我可以看到两个选项:

  1. 为每个表使用单独的数据库/文件,以使用内置的版本升级功能。

  2. 使用数据库版本号来了解“模式”何时更改,但有一个单独的表来存储当前的 TABLE_VERSIONS 并通过对照当前构建和 DROP 检查每个表的版本号来管理我自己的升级/在需要的地方创建表格。

(我不想在这里重新发明轮子,所以我希望我遗漏了一些简单的东西......)

最佳答案

您需要一个抽象类来实现此处描述的升级过程。然后为每个表扩展这个抽象类。在您的抽象类中,您必须以某种方式(列表,硬编码)存储您的表,以便在 onUpgrade 触发时迭代表项,并为每个表项执行所描述的步骤。他们将 self 升级,保留所有现有细节。请注意,每个数据库只会触发一次 onUpgrade 事件,这就是为什么您需要遍历所有表以对所有表进行升级的原因。您只维护整个数据库的 1 个版本号。

  • 开始交易
  • 使用 if not exists 运行表创建(我们正在进行升级,所以该表可能还不存在,更改和删除将失败)
  • 将现有列 List<String> columns = DBUtils.GetColumns(db, TableName); 放入列表中
  • 备份表(ALTER table " + TableName + " RENAME TO 'temp_" + TableName)
  • 创建新表(最新的表创建模式)
  • 获取与新列的交集,这次是从升级表 (columns.retainAll(DBUtils.GetColumns(db, TableName));) 中获取的列
  • 恢复数据(String cols = StringUtils.join(columns, ",");
    db.execSQL(String.format(
    "INSERT INTO %s (%s) SELECT %s from temp_%s",
    TableName, cols, cols, TableName));
    )
  • 删除备份表 ( DROP table 'temp_" + TableName )
  • 设置交易成功

(这不会处理表降级,如果您重命名列,则不会传输现有数据,因为列名称不匹配)。

.

public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
List<String> ar = null;
Cursor c = null;
try {
c = db.rawQuery("select * from " + tableName + " limit 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} catch (Exception e) {
Log.v(tableName, e.getMessage(), e);
e.printStackTrace();
} finally {
if (c != null)
c.close();
}
return ar;
}

public static String join(List<String> list, String delim) {
StringBuilder buf = new StringBuilder();
int num = list.size();
for (int i = 0; i < num; i++) {
if (i != 0)
buf.append(delim);
buf.append((String) list.get(i));
}
return buf.toString();
}

关于android - 升级具有多个表的Android应用程序数据(不破坏未受影响的表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585878/

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