我编写了一些代码,以确保在发布对应用程序的更新时可以正确更新数据库.
问题是SQLiteOpenHelper的OnUpdate()函数从不被调用.
这是我在主要活动中编写的代码-
SharedPreferences DB_ver = getSharedPreferences(PREFS_NAME, 0);
myDbHelper = new DataBaseHelper(con, DB_ver.getInt("DB_ver", 1));
try {
if(DB_ver.getInt("DB_ver", 1) !=getPackageManager().getPackageInfo(getPackageName(), 0).versionCode )
{
SharedPreferences.Editor editor = DB_ver.edit();
editor.putInt("DB_ver", getPackageManager().getPackageInfo(getPackageName(), 0).versionCode);
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
这是SQLiteOpenHelper的构造函数(它扩展了SQLiteOpenHelper)-
public DataBaseHelper(Context context,int ver_code) {
super(context, DB_NAME, null, ver_code);
this.myContext = context;
}
现在,我了解到Super行应该自动调用onUpgrade()函数,但事实并非如此.
我已经分别测试了onUpgrade()函数,并且可以正常工作.
有谁知道这是什么问题?
谢谢!
解决方法:
您所做的事情实际上不是必需的. SQLiteOpenHelper可以满足您的所有需求.这是一个可能的情况. SQLiteOpenHelper有一个getVersion()方法,以防您需要一次查询它(我从没做过):
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static final String dbname = "whatever";
private static final int dbversion = 1; // your first version
//private static final int dbversion = 2; // your second version
//private static final int dbversion = 3; // your third version
public MySQLiteOpenHelper(Context context) {
super(context, dbname, null, dbversion);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase sqliteDatabase) {
// ... Create first database content
}
@Override
public void onUpgrade(SQLiteDatabase sqliteDatabase, int oldVersion, int newVersion) {
switch (newVersion) {
case dbversion: // suppose your on third version
if (oldVersion == 1) {
upgradeFrom1To2(sqliteDatabase);
upgradeFrom2To3(sqliteDatabase);
}
if (oldVersion == 2) {
upgradeFrom2To3(sqliteDatabase);
}
break;
default:
break;
}
}
public void upgradeFrom1To2(SQLiteDatabase sqliteDatabase) {
// ...
}
public void upgradeFrom2To3(SQLiteDatabase sqliteDatabase) {
// ...
}
}
标签:sqlite,android,database
来源: https://codeday.me/bug/20191208/2091682.html