2012-02-05 6 views
6

我試圖更新下面的代碼我的數據庫表:getWritableDatabase遞歸調用

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

     String query = "ALTER TABLE names ADD COLUMN hidden integer default 0"; 
     dbHelper.getWritableDatabase().rawQuery(query, null); 

    } 

然而,當我啓動應用程序,並嘗試升級我得到下面的異常數據庫:

...Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively 

有誰知道我可以解決這個問題,究竟是什麼導致了它?

感謝

+0

這不可能是這部分代碼被調用的唯一地方嗎? – JoxTraex 2012-02-05 20:54:52

+0

是的,這是代碼被調用的唯一地方。我也在函數中添加了一條日誌語句,它只被調用一次。 – Nick 2012-02-05 21:00:20

+0

然後做一個檢查,如果舊版本<新版本。這將使它獨佔,雖然我不知道爲什麼它被多次調用。 – JoxTraex 2012-02-05 21:01:24

回答

23

別叫getWritableDatabase()。使用通過的:

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

    String query = "ALTER TABLE names ADD COLUMN hidden integer default 0"; 
    db.rawQuery(query, null); 

} 

爲什麼?當您撥打getWritableDatabase()時,OpenHelper檢測到數據庫需要更新,因此會啓動您所看到的遞歸警告。換句話說,你在onUpgrade()。您致電getWritableDatabase(),看到需要升級。如果不是支票,你會回到onUpgrade(),無限無盡。

+0

很好的答案,完全錯過了@Brian Dupuis +1 – JoxTraex 2012-02-05 21:12:41

+0

樹林:)。謝謝。 – 2012-02-05 21:14:01

+0

完美,謝謝! – Nick 2012-02-05 21:15:48