2013-04-11 83 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