我有一个版本1.0的应用程序,现在我hade制作了newxt版本,现在我想要升级数据库,但我无法升级数据库。 android studio从这一行给出错误:
db = this.getReadableDatabase();
。 这是完整的代码:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db = this.getReadableDatabase();
Cursor SignalRes = db.rawQuery("select * from signal", null);
db.execSQL("DROP TABLE IF EXISTS signal");
onCreate(db);
SignalRes.moveToFirst();
while (!SignalRes.isAfterLast()) {
insertSignal((SignalRes.getInt(0)), SignalRes.getString(1), SignalRes.getString(2)
, SignalRes.getString(3), SignalRes.getString(4), SignalRes.getString(5)
, SignalRes.getString(6), SignalRes.getString(7), SignalRes.getString(8));
SignalRes.moveToNext();
}
SignalRes.close();
答案 0 :(得分:2)
onUpgrade已传入db变量,因此您应该只使用该变量而不是再次分配它。如果您也可以发布错误消息会更好,但我怀疑您是在递归地打开数据库。
顺便说一下,检查这个post,你还需要澄清newVersion和oldVersion之间的关系,以表明你希望何时更新数据库。
所以你的代码应该是这样的:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < YOUR_NEW_DB_VERSION) {
db.execSQL(YOUR_QUERY_TO_MOVE_DATA_FROM_TABLE1_TO_TABLE2);
db.execSQL(YOUR_QUERY_TO_DROP_TABLE1);
}
}
答案 1 :(得分:-1)
1)定义一个变量,如 private static final int DATABASE_VERSION = 5;
2)您的SQLiteOpenHelper类构造函数和超级方法将检查版本
public EzberletDB(Context context) {
super(context, DATABASE_NAME,null,DATABASE_VERSION);
this.context=context;
SQLiteDatabase db = getWritableDatabase();
db.close();
try {
context.openOrCreateDatabase(DATABASE_NAME, context.MODE_PRIVATE, null);
} catch (Exception e) {
context.openOrCreateDatabase(DATABASE_NAME,context.MODE_PRIVATE,null);
}
}
3)onUpgrade方法,如果版本有机会执行该方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
String query="";
query = "DROP TABLE IF EXISTS signal";
db.execSQL(query);
onCreate(db);
} catch (SQLException e) {
e.printStackTrace();
Message.message(context,""+e);
}
}
最后:如果将DATABASE_VERSION增加到6,您的数据库将会更新。我希望你不能用这种方式丢失用户数据。