2012-02-05 77 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