2013-04-11 79 views
13

我第一次在這裏問一個問題,所以要溫柔,哈哈。getDatabase遞歸調用

無論如何。我一直在研究Android,我的最新版本完美無缺。直到昨天,IT部門給了我一臺新的工作站。自從得到這個新的工作站,我不斷收到以下錯誤:

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

如果有幫助,我在虛擬設備上運行此,利用平臺4.2.2和API級別17

我我真的希望有人能夠澄清這個錯誤,所以我可以停止把我的頭髮撕掉,哈哈。

如果需要其他信息,請讓我知道。

非常感謝,

布拉德。

編輯:添加更多的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 

編輯:添加的代碼導致錯誤。 setDefaultLabel()是罪魁禍首。

@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

發佈錯誤而不顯示導致它的代碼不會幫助任何人來幫助你。此外,張貼更多的logcat,因爲應該有一個「由...引起」行。 – Squonk 2013-04-11 18:15:46

+0

那麼代碼並沒有改變,所以我認爲它在這個特殊情況下不相關。該項目本身也很大,並不確定這個錯誤來自哪裏。完整的logcat已添加到原始帖子中。由行引起的同樣的事情,getDatabase遞歸地調用。同樣,唯一改變的就是工作站..非常困惑。無論如何,謝謝你的回覆。 – 2013-04-11 19:30:34

+0

好的......所以顯然我正在睡覺..再次閱讀logcat之後,我注意到了一些我以前沒有看到過的東西..我承認我現在覺得發佈這個很愚蠢。無論如何,導致此錯誤的代碼已添加到原始帖子中。仍然不確定爲什麼它會導致這個問題,所以任何額外的援助都會很大。再次感謝。 B, – 2013-04-11 19:58:34

回答

34

試着改變你的setDefaultLabel()方法...

public void setDefaultLabel(SQLiteDatabase db) 

...然後在onCreate(...)只是db參數傳遞到它,擺脫這一行的......

SQLiteDatabase db = this.getWritableDatabase(); 

您的代碼應該看起來像這樣...

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

現有代碼中的問題是onCreate(...)正在傳遞對開放式/可寫入數據庫的引用,但它隨後調用setDefaultLabel(...),它試圖獲得對數據庫的另一個可寫入引用。

+0

哇,非常感謝。我不相信我錯過了這一點。我猜偶爾睡覺是件好事,哈哈。無論如何,不​​會再犯這個錯誤,儘管它不像我所希望的那樣工作。試圖創建db時創建的「默認」記錄。將不得不返回到繪圖板。再次感謝所有的幫助。 – 2013-04-11 20:56:53

+0

@BradBass:至少這是你現在瞭解的一個錯誤,不必擔心。樂意效勞。祝好運並玩得開心點。 – Squonk 2013-04-11 21:09:51

+0

這不會忽略getWriteableDatabase方法嗎?這種方法是不必要的? – AlleyOOP 2013-12-30 22:45:51

1

這裏是我的這個解決方案: 在助手,我重寫2種方法getWritableDatabase()和getReadableDatabase()象下面這樣: 注意,你不應該關閉數據庫,可以墜毀。

@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:嘗試重新打開一個已經關閉的對象: – Galya 2017-09-01 14:31:44