10

我创建了一个 Android 应用程序,在启动时检查是否有新版本的应用程序。如果是,则应用程序下载新的 apk 文件并过度安装新的 apk。我的应用程序使用 sqlite 数据库。但是这个数据库,从一个版本到另一个版本可以改变。我想我必须使用以下方法:

 onUpgrade()

但我不知道如何使用它。

当我启动应用程序时,我将此代码用于 crete 数据库(如果不存在):

DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION)

如果我想使用onUpgrade()方法,我应该改变什么?我什么时候必须调用它?

4

3 回答 3

20

onUpgrade()当您的数据库版本更改时调用(您自己不调用它),这意味着基础表结构更改等。

一般来说,这意味着操作系统告诉你“嘿,你要求数据库结构版本 10,但我发现我们这里有一些旧的东西,所以这是你在开始使用数据库之前修复它的机会(并且可能由于结构不匹配而崩溃) ”

在这种方法中,您应该做所有必要的事情,嗯.. 升级旧数据库的结构以匹配当前版本要求的结构,例如添加/删除列、转换行内容甚至完全删除旧数据库并从头开始创建它 - 对于 Android你在这里做什么并不重要——这只是一种紧急回调,让你的代码完成必要的工作(如果有的话)。您需要注意用户可能不会经常更新,因此您必须始终处理从版本 X 升级到 Y 的操作,因为您知道 X 可能不等于 ie (Y-1)。

于 2012-10-31T13:35:44.583 回答
5

如果您使用的是 SQLiteOpenHelper,则无论何时更改数据库版本都会调用 onUpgrade。有一个额外的要求才能工作。数据库名称必须保持不变。

Old Version:
dbName = "mydb.db"
dbVersion = 1

New Version:
dbName = "mydb.db"
dbVersion = 2

在内容提供者的 onCreate 中,您创建一个接受这些参数的 SQLiteOpenHelper 实例。您的 SQLiteOpenHelper 实现如下所示:

public static final class MySQLiteOpenHelper extends SQLiteOpenHelper {

        public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) {
            super(context, dbName, null, dbVersion);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //Code to create your db here
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // Code to upgrade your db here
        }

}

当您更改表或在数据库中添加更多表时,它也会被调用

于 2012-10-31T13:43:56.820 回答
3

我发现这很有帮助 https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}
于 2017-09-01T14:00:49.960 回答