ORMLite更新数据库

Ale*_* C. 17 database android ormlite

我实际上正在开发一个使用ORMLite库的应用程序(这很棒btw),但我是初学者使用它.

我有一个关于设备内部数据库更新的问题.

假设有人在Google Play上下载了我的应用.几个月后,我肯定会在一些表中填入新的条目.

当此人正在对应用程序进行更新时,如何使用我的新条目更新数据库并将旧文件保留在其中.

更清楚一点,想象用户在我的应用程序中回答了问题.当我将介绍新问题时,如何在更新我的应用程序时将其插入数据库并保留已经回答的问题?

Gra*_*ray 33

当此人正在对应用程序进行更新时,如何使用我的新条目更新数据库并将旧文件保留在其中.

我们的想法是使用传递给onUpgrade(...)方法的版本号.使用ORMLite,该OrmLiteSqliteOpenHelper.onUpgrade(...)方法采用a oldVersionnewVersionnumber.然后,您可以将转换代码编写到您的应用程序中,该代码能够转换旧格式的数据并更新架构.

有关更多信息,请参阅有关该主题的ORMLite文档:

http://ormlite.com/docs/upgrade-schema

要引用,您可以执行以下操作:

if (oldVersion < 2) {
  // we added the age column in version 2
  dao.executeRaw("ALTER TABLE `account` ADD COLUMN age INTEGER;");
}
if (oldVersion < 3) {
  // we added the weight column in version 3
  dao.executeRaw("ALTER TABLE `account` ADD COLUMN weight INTEGER;");
}
Run Code Online (Sandbox Code Playgroud)

如果您有需要转换的现有数据,那么您应该尽可能在SQL中进行转换.

另一种选择是使Account实体和OldAccount实体指向同一个表名.然后,您可以OldAccount使用它读取实体oldAccountDao,将它们转换为Account实体,然后使用accountDao返回到同一个表来更新它们.你需要注意这里的对象缓存.


Ter*_*rel 7

我是这样做的:

@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {

    switch (oldVersion) {
    case 1:
        updateFromVersion1(database, connectionSource, oldVersion, newVersion);
        break;
    case 2:
        updateFromVersion2(database, connectionSource, oldVersion, newVersion);
        break;
    default:
        // no updates needed
        break;
    }

}

private void updateFromVersion1(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
    // do some stuff here
    onUpgrade(database, connectionSource, oldVersion + 1, newVersion);
}

private void updateFromVersion2(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
    // do some stuff here
    onUpgrade(database, connectionSource, oldVersion + 1, newVersion);
}
Run Code Online (Sandbox Code Playgroud)

这将逐步更新用户db,而不依赖于他来自哪个db版本.

  • 如果删除中断句子并在开头移动默认值,则不需要递归调用 (7认同)