我创建了一个Android应用程序,如果有新版本的应用程序,请在启动时检查。如果是,则应用程序下载新的apk文件并过度安装新的apk。 我的应用程序使用sqlite db。但是这个db,从一个版本到另一个版本都可以改变。 我想我必须使用这个方法:
onUpgrade()
但我不确切知道如何使用它。
当我启动应用程序时,我将此代码用于克里特数据库(如果不存在):
DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION)
如果我想使用onUpgrade()
方法,我应该更改什么?
我什么时候打电话呢?
答案 0 :(得分:19)
onUpgrade()
(您不会自己调用),这意味着基础表结构发生了变化等。
一般来说,这意味着操作系统告诉你“嘿,你问过数据库结构版本10但是我发现我们在这里找到了更旧的东西,所以你有机会在开始使用数据库之前修复它(可能由于结构不匹配导致崩溃)“。
在该方法中,你应该做所有必要的事情,好吧..升级旧数据库的结构,以构建匹配当前版本的要求,如添加/删除列,转换行内容,甚至完全删除旧数据库,并从头开始创建它 - 对于Android,你在这里做什么并不重要 - 它只是你的代码执行必要工作(如果有的话)的紧急回调。您需要注意用户可能不会经常更新,因此您必须始终处理从版本X升级到Y,因为X可能不等于即(Y-1)。
答案 1 :(得分: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
}
}
当您更改表格或在数据库中添加更多表格时也会调用它
答案 2 :(得分:1)
我发现这非常有帮助 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);
}
}