2012-02-05 13 views
6

Ja próbuje zaktualizować tabelę bazy danych z następującego kodu:getWritableDatabase nazywany rekursywnie

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); 

    } 

Jednak, kiedy uruchomić aplikację i próbuje uaktualnić bazy danych pojawia się następujący wyjątek:

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

Czy ktoś wie, jak mogę obejść ten problem i co dokładnie jest przyczyną?

Dzięki

+0

to nie może być jedyne miejsce, w którym zostanie wywołana ta część kodu, prawda? – JoxTraex

+0

Tak, to jedyne miejsce, w którym jest wywoływany kod. Umieszczam również w tej funkcji instrukcję dziennika i jest ona wywoływana tylko raz. – Nick

+0

Następnie sprawdź, czy stara wersja jest JoxTraex

Odpowiedz

23

Nie nazywaj getWritableDatabase(). Użyj tego przekazanego:

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

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

} 

Dlaczego? Podczas wywoływania getWritableDatabase() OpenHelper wykrywa, że ​​baza danych wymaga aktualizacji, dlatego uruchamia ostrzeżenie o rekursji, które widzisz. Innymi słowy, jesteś w onUpgrade(). Dzwonisz pod numer getWritableDatabase(), który wymaga uaktualnienia. Gdyby nie czek, wróciłbyś do onUpgrade(), ad infinitum.

+0

Świetna odpowiedź, całkowicie tęskniłem za @Brian Dupuis +1 – JoxTraex

+0

Las dla drzew :). Dzięki. –

+0

Doskonały, dzięki! – Nick

Powiązane problemy