2013-04-11 4 views
13

Mein erstes Mal eine Frage hier stellen, also sei sanft, Lol.getDatabase rekursiv aufgerufen

Wie auch immer. Ich habe an einem Android gearbeitet und mein neuestes Build lief fehlerfrei. Bis gestern, als IT mir eine neue Workstation gab. Da diese neue Workstation bekommen, ich bekomme immer folgende Fehlermeldung:

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

Wenn es hilft, ich dies in einem virtuellen Gerät leite, mit Plattform 4.2.2 und API-Ebene 17.

I Ich hoffe wirklich, dass jemand etwas Licht auf diesen Fehler werfen kann, damit ich aufhören kann, mir die Haare auszureißen, Lol.

Wenn weitere Informationen benötigt werden, lassen Sie es mich bitte wissen.

Vielen Dank,

Brad.

EDIT: mehr der logcat Hinzugefügt

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: Code hinzugefügt, der den Fehler verursacht. setDefaultLabel() ist der Schuldige.

@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

Einen Fehler zu melden, ohne den Code anzuzeigen, der es verursacht, wird niemandem helfen, Ihnen zu helfen. Veröffentlichen Sie außerdem mehr von dem Logcat, da es eine "Caused by ..." Zeile geben sollte. – Squonk

+0

Nun, der Code hatte sich überhaupt nicht geändert, deshalb hielt ich das in diesem speziellen Fall für nicht relevant. Das Projekt selbst ist auch ziemlich groß und nicht wirklich sicher, woher dieser Fehler kommt. Das vollständige Logcat wurde dem ursprünglichen Post hinzugefügt. Die Zeile "By caused by" gibt dasselbe wie getDatabase rekursiv an. Das einzige, was sich geändert hat, ist der Arbeitsplatz. Sehr verwirrt. Wie auch immer, danke für die schnelle Antwort. –

+0

Ok ... Also anscheinend habe ich geschlafen. Nachdem ich den Logcat nochmal durchgelesen habe, habe ich etwas bemerkt, das ich vorher nicht hatte ... Ich gebe zu, dass ich mich jetzt ziemlich albern fühle, weil ich das gepostet habe. Der Code, der diesen Fehler verursacht, wurde dem ursprünglichen Post hinzugefügt. Immer noch unsicher, warum es dieses Problem verursachen würde, so würde jede zusätzliche Hilfe groß sein. Danke noch einmal. B. –

Antwort

34

Versuchen Sie setDefaultLabel() Methode Wechsel zu ...

public void setDefaultLabel(SQLiteDatabase db) 

... dann in onCreate(...) einfach passieren den db Parameter hinein und werde diese Linie zu befreien ...

SQLiteDatabase db = this.getWritableDatabase(); 

Ihr Code sollte dann so aussehen ...

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

Das Problem in Ihrem vorhandenen Code ist, dass onCreate(...) ein Verweis auf die offene/schreibbare Datenbank übergeben wird, aber es ruft dann setDefaultLabel(...), die versucht, einen anderen beschreibbaren Verweis auf die Datenbank zu erhalten.

+0

Wow, vielen Dank. Ich kann nicht glauben, dass ich das verpasst habe. Ich schätze mal schlafen ist eine gute Sache, Lol.Jedenfalls nicht mehr den Fehler, obwohl es nicht genau so funktioniert, wie ich es mir erhofft hatte. Wurde versucht, einen "Standard" -Datensatz zu erstellen, wenn die Datenbank erstellt wird. Muss zurück zum Zeichenbrett gehen. Danke nochmal für die Hilfe. –

+0

@BradBass: Nun, das ist zumindest ein Fehler, den Sie jetzt verstehen und sich keine Sorgen machen müssen. Froh, dass ich Helfen kann. Viel Glück und hab Spaß. – Squonk

+0

Vernachlässigt dies nicht die getWriteableDatabase-Methode insgesamt? Ist diese Methode unnötig? – AlleyOOP

1

Hier ist meine Lösung für dieses: Im Helper, ich überschreiben 2 Methoden getWritableDatabase() und getReadableDatabase() wie unten: Beachten Sie, dass die Datenbank nicht schließen sollte, ist es zum Absturz gebracht werden kann.

@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: Versuch, ein bereits geschlossenes Objekt erneut zu öffnen: – Galya