2

假设我有一个 SQLite 数据库,我在一个单独的程序中创建并包含在应用程序启动时要复制的 assets 文件夹中(假设它不存在)。数据库包含两列,A 和 B。假设 A 包含位置列表(巴黎、伦敦、纽约等——用户无法编辑的内容),B 存储用户访问相应位置的次数(用户可以在应用程序内编辑)。

现在假设我在原始数据库中拼写错误的位置名称。我进入我的 SQLite 浏览器,快速修复该条目,保存它,然后替换我的资产文件夹中的旧数据库文件。如何更新已复制的数据库中的 A 列,以反映我对资产文件夹中现在只读数据库所做的更改,而不擦除它们存储的数据?

我最初的印象是使用 onUpgrade,但我看到有人说它只是用于更新数据库的架构。在这种情况下,我的架构没有改变,只有其中的一些数据......

4

2 回答 2

2

让我们从头开始。当您使用构造函数 SQLiteOpenHelper 打开数据库时,它将从您那里获取版本信息。

如果数据库不存在,它会调用 onCreate 方法。如果现有数据库的版本低于您的版本,则会调用 onUpgrade 方法。

请阅读 android文档以获取更多信息。

因此,您可以在 onCreate 方法中插入您的初始信息。您可以在 onUpgrade 方法中更改表或向表中插入一些附加信息。

希望能帮助到你..

于 2012-06-12T05:51:24.773 回答
1

onUpgrade用于您需要的东西是正确的。我在升级期间更新了模式和静态数据。我的 onUpgrade 结构如下:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        if (oldVersion < 211)
        {
            // In this version we transfer Log data into new date keeping format - just milliseconds, no string formatting
            db.execSQL("DROP TABLE IF EXISTS " + LogData.TABLE_NAME);
            db.execSQL(LogData.TABLE_CREATE_SQL);
            logInformation(db, "Application upgraded to 2.1.1 level and existing log data cleared from device.");
        }

        if (oldVersion < 212)
        {
        }

        if (oldVersion < 220)
        {
            db.execSQL("DROP TABLE IF EXISTS " + MailData.MAIL_TABLE_NAME);
        }
    }
于 2012-06-12T05:46:50.097 回答