2015-06-02 47 views
0

我在我的應用程序使用SQLiteDatabase數據。我的SQLiteOpenHelper.onUpgrade(..)方法如下所示:的Android SQLiteDatabase更新模式,而不失去

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    //Save current data 
    ArrayList<Course> tempCourses = getAllCourses(); 

    //Drop tables 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_COURSES); 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ASSIGNMENTS); 

    //create new tables 
    onCreate(db); 

    //Add temp data back to the database 
    for (Course course : tempCourses) { 
     addCourse(course); 
    } 
} 

我想在升級數據庫模式時保留舊的userdata。 但是我得到以下錯誤,當我增加數據庫版本並啓動我的應用程序:

... 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tak3r07.unihelper/com.tak3r07.CourseStatistics.MainActivity}: java.lang.IllegalStateException: getDatabase called recursively 
... 

這是因爲getAllCourses()將再次打開該數據庫獲得該調用onUpgrade方法(明顯的循環)的數據。 但是,我應該如何存儲我的userdata呢?

問候, Tak3r07

+0

你想要做什麼?添加一列? – tyczj

回答

2

ALTER TABLE命令可以用來而不丟失數據上執行現有的表的一些架構更改。如果你發現你需要從頭開始創建表,你應該遵循以下模式:

  1. BEGIN TRANSACTION
  2. 創建新表
  3. 做一個insert .. select statement
  4. 刪除舊錶
  5. 提交交易

如果任何步驟失敗,您仍然有數據,你可以在任何步驟來完成牛逼回暖如果因任何原因失敗,他會升級。你希望所有的課程加載到你的應用程序的內存就像你正在做的,然後刪除該表,因爲如果你的應用程序未能插入課程回分貝,你會丟失所有數據。在SQL中完成所有操作。

+1

ALTER TABLE正是我正在尋找的!我忘了考慮「如果失敗了」部分。好點子! – Tak3r07

相關問題