Android中的onUpgrade()sqlite数据库

GVi*_*i82 8 sqlite android

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

 onUpgrade()
Run Code Online (Sandbox Code Playgroud)

但我不确切知道如何使用它.

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

DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION)
Run Code Online (Sandbox Code Playgroud)

如果我想使用onUpgrade()方法,我应该改变什么?我什么时候打电话给它?

Mar*_*ski 19

onUpgrade() 当数据库版本发生变化时,调用(你不会自己调用),这意味着基础表结构发生变化等.

一般来说,这意味着操作系统告诉你" 嘿,你问过数据库结构版本10但是我发现我们在这里找到了更旧的东西,所以你有机会在开始使用数据库之前修复它(并且可能因结构不匹配而崩溃) ".

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

  • 是.版本号只是`int`,所以你可以定期做`switch/case`.但重要的是,你应该处理从版本2升级到3但从1升级到3(我可能只是在那里循环,首先从1升级到2,然后从2升级到3),这可能是比处理从1到3的直接更新(或从1到80以提供更广泛的视角)更简单 (2认同)

Dee*_*jan 5

如果您正在使用SQLiteOpenHelper,则每当您更改数据库版本时都会调用onUpgrade.还有一个额外的要求.数据库名称必须保持不变.

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

New Version:
dbName = "mydb.db"
dbVersion = 2
Run Code Online (Sandbox Code Playgroud)

在内容提供程序的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
        }

}
Run Code Online (Sandbox Code Playgroud)

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