我写了一些代码,以确保在我发布应用程序更新时正确更新我的数据库。
问题是从不调用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;
}
现在我明白超级线应该自动调用onUpgrade()函数,但它没有。
我已经单独测试了onUpgrade()函数,它可以工作。
有谁知道这是什么问题?
谢谢!
答案 0 :(得分:1)
两件事:
editor.commit()
。onUpgrade()
,否则不需要调用。首次创建数据库时将调用onCreate()
,但只有在报告的版本不同时才会调用onUpgrade()
。答案 1 :(得分:1)
您应该更改整数“VERSION”以使您的onUpgrade被调用。
此外,onUpgrade接收两个整数,第一个是数据库的当前版本(从中升级),第二个是要升级到的版本。
答案 2 :(得分:1)
你做的事情真的不是必要的。 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) {
// ...
}
}
答案 3 :(得分:0)
我看到的一件事是您没有将更改提交给您正在打开的SharedPreferences。你需要调用editor.commit();保存对SharedPreferences的更改。
另外,您是否尝试以读取或写入模式实际打开数据库?