【问题标题】:Update specific table when onUpgrade with SQLite with provided database使用提供的数据库使用 SQLite 进行 onUpgrade 时更新特定表
【发布时间】:2015-09-17 13:17:58
【问题描述】:

可能这里的某个地方可以回答我的问题,但如果它存在,我找不到它。 这是我的问题: 我在资产文件夹中提供了数据库。当我想更新我的应用程序时,因为我在特定表中添加了更多行,我增加了数据库版本,调用 this.getWritableDatabase();并调用 onUpgrade,至此一切正常。 但接下来呢? 这是我的 onUpgrade 函数:

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {
    if(i < i2) {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null,SQLiteDatabase.OPEN_READWRITE);
        db.execSQL("attach database ? as newdb", new String[]{DB_PATH + DB_NAME}); // I have to attach new version of db to the old one and then i can go on
        db.execSQL("delete from GAME");
        db.execSQL("INSERT INTO GAME SELECT * FROM newdb.GAME");
        db.close();
}

这给了我一个错误,我的数据库被锁定 - 在线:

db.execSQL("INSERT INTO GAME SELECT * FROM newdb.GAME");

我尝试了很多不同的场景,但我就是做不到。 如果有人能帮我让它工作,我会很高兴;)

【问题讨论】:

    标签: android database sqlite upgrade


    【解决方案1】:

    如果你的onUpgrade 没有使用它的第一个参数,它就会出错。

    dbnewdb 是同一个数据库(两次都用DB_PATH + DB_NAME 打开)。

    您可能希望将db 替换为sqLiteDatabase

    【讨论】:

    • 是的,我用 sqLiteDatabase 替换了 db,它给了我 npe。 sqLiteDatabase 变量只是 null (我试图更新它,但里面什么都没有)。
    • SQLiteOpenHelper 从不调用onUpgradenull DB。
    • 嗯,在我的情况下,我猜是这样。我有标准实现,当我第一次运行应用程序时一切正常,我的数据库被复制到内部存储并且应用程序工作正常。然后,我将 db 版本从 1 更改为 2 并再次安装应用程序。 onUpgrade 已打开,里面的第一行现在是“ sqLiteDatabase.execSQL("delete from GAME"); ”。而且我有一个错误“ no such table: GAME (code 1): , while compile: delete from GAME”,所以 sqLiteDatabase 为空。
    • 再一次,100% 确定。在行 public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) { - sqLiteDatabase 是我的实际数据库,旧的,是吗?所以它不应该为空:/
    • 如果sqLiteDatabasenull,你会得到一个空指针异常。 “no such table: GAME”表示该表不存在,可能是因为数据库创建代码中的错误。无论如何,已经回答了实际问题(为什么数据库被锁定)。如果您有新问题,ask a new one
    【解决方案2】:

    onUpgrade 表示您要升级数据库,而不是将某些数据从旧数据库复制到新数据库。此方法为您提供升级所需的一切 - 数据库实例为特定版本滚动升级脚本。 SQL 非常强大,您可以添加/删除列、删除表等等,所以我看不出创建另一个文件的理由。

    【讨论】:

    • 我知道这意味着升级,这就是我想要做的。在这种情况下,将数据从旧数据复制到新数据就是升级。我觉得你不太了解我。我不想制作另一个文件,我只是向我的应用程序提供手动准备的包含很多行的数据库。
    • 在这种情况下,你不明白我想告诉你什么。要升级,您应该创建 SQL 语句来更改您的数据库架构以匹配您的新数据库架构,然后使用 SQL 滚动所有数据。
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2020-03-31
    • 2021-04-07
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多