如何通过保存用户数据将sqlite数据库升级到下一个版本

时间:2016-06-18 21:10:22

标签: android sqlite

我有一个版本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();

2 个答案:

答案 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,您的数据库将会更新。我希望你不能用这种方式丢失用户数据。