2013-04-11 20 views
13

Po raz pierwszy zadaję tutaj pytanie, więc bądź łagodny, Lol.getDatabase o nazwie rekursywnie

W każdym razie. Pracowałem nad systemem Android, a moja najnowsza kompilacja działała bez zarzutu. Do wczoraj, kiedy dział IT dał mi nową stację roboczą. Ponieważ coraz to nowe stanowiska pracy, wciąż otrzymuję następujący błąd:

04-11 17:34:53.282: E/AndroidRuntime(789): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blueharvest/com.example.blueharvest.SettingsActivity}: java.lang.IllegalStateException: getDatabase called recursively

Jeśli to nie pomaga, używam tego w urządzeniu wirtualnym, wykorzystując platformę 4.2.2 i poziom API 17.

I Naprawdę mam nadzieję, że ktoś może rzucić trochę światła na ten błąd, więc mogę przestać wyrywać mi włosy, Lol.

Jeśli potrzebna jest jakakolwiek inna informacja, proszę dać mi znać.

Dziękuję bardzo,

Brad.

EDIT: Dodano więcej z LogCat

04-11 19:25:08.668: E/AndroidRuntime(2748): FATAL EXCEPTION: main 
04-11 19:25:08.668: E/AndroidRuntime(2748): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blueharvest/com.example.blueharvest.SettingsActivity}: java.lang.IllegalStateException: getDatabase called recursively 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.os.Looper.loop(Looper.java:137) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at dalvik.system.NativeStart.main(Native Method) 
04-11 19:25:08.668: E/AndroidRuntime(2748): Caused by: java.lang.IllegalStateException: getDatabase called recursively 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.example.blueharvest.DatabaseHandler.setDefaultLabel(DatabaseHandler.java:90) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.example.blueharvest.DatabaseHandler.onCreate(DatabaseHandler.java:82) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at com.example.blueharvest.DatabaseHandler.populateFields(DatabaseHandler.java:196) 
04-11 19:25:08.668: E/AndroidRuntime(2748): at com.example.blueharvest.SettingsActivity.onCreate(SettingsActivity.java:45) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.Activity.performCreate(Activity.java:5104) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
04-11 19:25:08.668: E/AndroidRuntime(2748):  ... 11 more 

EDIT: Dodano kodu powodującego błąd. setDefaultLabel() jest winowajcą.

@Override 
public void onCreate(SQLiteDatabase db) { 
    // Create tables   
    db.execSQL(CREATE_CATEGORIES_TABLE);   
    db.execSQL(CREATE_CHRGDATA_TABLE); 
    db.execSQL(CREATE_SETTINGS_TABLE); 
    setDefaultLabel(); 
} 

/** 
* 
*/ 

public void setDefaultLabel() { 
    // create default label 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, "Default"); 
    db.insert(TABLE_LABELS, null, values); 
} 
+2

Opublikowanie błędu bez wyświetlania kodu, który go powoduje, nikomu nie pomoże. Ponadto, dodaj więcej kodu logcat, ponieważ powinna być linia "Przyczyna ...". – Squonk

+0

Kod nie uległ zmianie, więc pomyślałem, że nie jest to istotne w tym konkretnym przypadku. Sam projekt jest dość duży i nie jest do końca pewny, skąd pochodzi ten błąd. Kompletny kod logcat został dodany do oryginalnego wpisu. Linia "Powodowane przez" stwierdza to samo, funkcja getDatabase jest wywoływana rekursywnie. Ponownie, jedyną rzeczą, która się zmieniła jest stacja robocza .. Bardzo zdezorientowana. W każdym razie, dziękuję za bardzo szybką odpowiedź. –

+0

Ok ... Najwyraźniej spałem. Po ponownym przeczytaniu logcat zauważyłem coś, czego wcześniej nie zauważyłem. Przyznaję, że czuję się teraz całkiem głupio, żeby to opublikować. W każdym razie kod powodujący ten błąd został dodany do oryginalnego wpisu. Nadal nie wiadomo, dlaczego spowodowałoby to problem, więc dodatkowa pomoc byłaby świetna. Dzięki jeszcze raz. B. –

Odpowiedz

34

Spróbuj zmienić metodę setDefaultLabel() do ...

public void setDefaultLabel(SQLiteDatabase db) 

... potem w onCreate(...) prostu przekazać parametr db do niego i pozbyć się tej linii ...

SQLiteDatabase db = this.getWritableDatabase(); 

Twój kod powinien wyglądać tak ...

@Override 
public void onCreate(SQLiteDatabase db) { 
    // Create tables   
    db.execSQL(CREATE_CATEGORIES_TABLE);   
    db.execSQL(CREATE_CHRGDATA_TABLE); 
    db.execSQL(CREATE_SETTINGS_TABLE); 
    setDefaultLabel(db); 
} 

/** 
* 
*/ 

public void setDefaultLabel(SQLiteDatabase db) { 
    // create default label 
    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, "Default"); 
    db.insert(TABLE_LABELS, null, values); 
} 

Problem w istniejącym kodzie polega na tym, że onCreate(...) jest przekazywane jako odniesienie do otwartej/zapisywalnej bazy danych, ale następnie wywołuje setDefaultLabel(...), która próbuje uzyskać inne odniesienie do zapisu w bazie danych.

+0

Wow, dziękuję bardzo. Nie mogę uwierzyć, że to przegapiłem. Chyba od czasu do czasu spanie to dobra rzecz, Lol.W każdym razie, nie dostaję już błędu, choć nie działa dokładnie tak, jak się spodziewałem. Próbowano utworzyć rekord "domyślny" podczas tworzenia bazy danych. Będzie musiał wrócić do deski kreślarskiej. Jeszcze raz dziękuję za całą pomoc. –

+0

@BradBass: Cóż, to jeden błąd, który teraz rozumiesz i nie musisz się martwić. Miło, że mogłem pomóc. Powodzenia i miłej zabawy. – Squonk

+0

Czy to zupełnie nie pomija metody getWriteableDatabase? Czy ta metoda jest zbędna? – AlleyOOP

1

Oto moje rozwiązanie tego problemu: W Helper, zastąpić 2 metody getWritableDatabase() i getReadableDatabase() jak poniżej: Zauważ, że nie powinno się zamknąć bazę danych, może to być rozbił.

@Override 
    public void onCreate(SQLiteDatabase db) { 
     // All your code here ..... 

     // Add default value for all tables 
     isCreating = true; 
     currentDB = db; 
     generateAllDefaultData(); 
     // release var 
     isCreating = false; 
     currentDB = null; 
    } 

    boolean isCreating = false; 
    SQLiteDatabase currentDB = null; 

    @Override 
    public SQLiteDatabase getWritableDatabase() { 
     // TODO Auto-generated method stub 
     if(isCreating && currentDB != null){ 
      return currentDB; 
     } 
     return super.getWritableDatabase(); 
    } 

    @Override 
    public SQLiteDatabase getReadableDatabase() { 
     // TODO Auto-generated method stub 
     if(isCreating && currentDB != null){ 
      return currentDB; 
     } 
     return super.getReadableDatabase(); 
    } 
+0

java.lang.IllegalStateException: próba ponownego otwarcia już zamkniętego obiektu: – Galya

Powiązane problemy