Android中的onUpgrade()sqlite数据库
我创建了一个Android应用程序,在启动时检查是否有新版本的应用程序。如果是,应用程序将下载新的apk文件并重新安装新的apk。 我的应用程序使用sqlite数据库。但是这个数据库,从一个版本到另一个版本可能会改变。 我认为我必须使用以下方法:Android中的onUpgrade()sqlite数据库,android,sqlite,Android,Sqlite,我创建了一个Android应用程序,在启动时检查是否有新版本的应用程序。如果是,应用程序将下载新的apk文件并重新安装新的apk。 我的应用程序使用sqlite数据库。但是这个数据库,从一个版本到另一个版本可能会改变。 我认为我必须使用以下方法: onUpgrade() 但我不知道怎么用 启动应用程序时,我将此代码用于CRET数据库(如果不存在): 如果我想使用onUpgrade()方法,我应该更改什么? 什么时候我必须调用它?onUpgrade()(您自己不调用它)是在数据库的版本更改时调
onUpgrade()
但我不知道怎么用
启动应用程序时,我将此代码用于CRET数据库(如果不存在):
如果我想使用onUpgrade()
方法,我应该更改什么?
什么时候我必须调用它?onUpgrade()
(您自己不调用它)是在数据库的版本更改时调用的,这意味着基础表结构更改等
一般来说,这意味着操作系统会告诉您“嘿,您要求数据库结构版本10,但我发现我们这里有一些更老的东西,所以这是您在开始使用数据库之前修复它的机会(并且可能由于结构不匹配而崩溃)”
用那种方法,你应该做一切必要的事情。。将旧数据库的结构升级到与当前版本要求相匹配的结构,比如添加/删除列、转换行内容,甚至完全删除旧数据库,然后从头开始创建它——对于Android来说,您在这里做什么并不重要——这只是一种紧急回调,让您的代码执行必要的工作(如果有的话)。您需要注意,用户可能不会经常更新,因此您必须始终处理从版本X到版本Y的升级,因为您知道X可能不等于(Y-1) 如果您使用的是SQLiteOpenHelper,则每当您更改DB版本时,都会调用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
}
}
当您更改表或在数据库中添加更多表时,它也将被调用我发现这非常有用
@覆盖
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
如果(旧版本<2){
execSQL(数据库改变团队1);
}
如果(旧版本<3){
execSQL(数据库变更团队2);
}
}
我注意到onUpgrade有两个int参数:oldVersion和newVersion。因此,如果我的应用程序中有版本1的数据库,并且下载的apk包含版本2的数据库,这允许系统自动调用onUpgrade()方法?就像我可以使用switch(oldVersion)中建议的那样,考虑到对每个旧版本所做的不同更改?对吗?此外,如果在新的db版本中,我将新列添加到某个表中,我还必须修改onCreate,以便使用新的附加列创建表?如果还没有安装任何应用程序并且必须创建新的数据库,那么这可能是有意义的。我的假设正确吗?是的。版本号仅为int
,因此您可以执行常规的切换/case
。但重要的是,例如,您应该处理从版本2到版本3的升级,但也应该处理从版本1到版本3的升级(我可能只是在这里循环,首先从版本1升级到版本2,然后从版本2升级到版本3),这可能比处理从版本1到版本3的直接更新(或者从版本1到版本80以提供更广泛的视角)更简单
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
}
}
@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);
}
}