getDatabase递归调用 [英] getDatabase called recursively

查看:184
本文介绍了getDatabase递归调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我第一次问一个问题在这里,所以要轻柔,大声笑。

反正。我一直工作在Android和我的最新版本完美地跑了。直到昨天,当它给了我一个新的工作站。自从得到这个新的工作站,我不断收到以下错误:

04-11 17:34:53.282:E / AndroidRuntime(789):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.blueharvest / com.example.blueharvest.SettingsActivity }:java.lang.IllegalStateException:getDatabase递归调用

如果有帮助,我在虚拟设备上运行,即使用4.2.2平台和API级别17。

我真的很希望有人能阐明此错误的光,这样我就可以停止撕扯我的头发,大声笑。

如果需要任何其他信息,请让我知道。

太感谢了,

布拉德。

编辑:添加更多的logcat的

  04-11 19:25:08.668:E / AndroidRuntime(2748):致命异常:主要
04-11 19:25:08.668:E / AndroidRuntime(2748):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.blueharvest / com.example.blueharvest.SettingsActivity}:java.lang.IllegalStateException:getDatabase递归调用
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.os.Handler.dispatchMessage(Handler.java:99)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.os.Looper.loop(Looper.java:137)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.ActivityThread.main(ActivityThread.java:5041)
04-11 19:25:08.668:E / AndroidRuntime(2748):在java.lang.reflect.Method.invokeNative(本机方法)
04-11 19:25:08.668:E / AndroidRuntime(2748):在java.lang.reflect.Method.invoke(Method.java:511)
04-11 19:25:08.668:E / AndroidRuntime(2748):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
04-11 19:25:08.668:E / AndroidRuntime(2748):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-11 19:25:08.668:E / AndroidRuntime(2748):在dalvik.system.NativeStart.main(本机方法)
04-11 19:25:08.668:E / AndroidRuntime(2748):java.lang.IllegalStateException:产生的原因getDatabase递归调用
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
04-11 19:25:08.668:E / AndroidRuntime(2748):在com.example.blueharvest.DatabaseHandler.setDefaultLabel(DatabaseHandler.java:90)
04-11 19:25:08.668:E / AndroidRuntime(2748):在com.example.blueharvest.DatabaseHandler.onCreate(DatabaseHandler.java:82)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
04-11 19:25:08.668:E / AndroidRuntime(2748):在com.example.blueharvest.DatabaseHandler.populateFields(DatabaseHandler.java:196)
 04-11 19:25:08.668:E / AndroidRuntime(2748):在com.example.blueharvest.SettingsActivity.onCreate(SettingsActivity.java:45)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.Activity.performCreate(Activity.java:5104)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-11 19:25:08.668:E / AndroidRuntime(2748):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-11 19:25:08.668:E / AndroidRuntime(2748):11 ...更多
 

编辑:添加code导致错误。 setDefaultLabel()是罪魁祸首。

  @覆盖
公共无效的onCreate(SQLiteDatabase DB){
    //创建表
    db.execSQL(CREATE_CATEGORIES_TABLE);
    db.execSQL(CREATE_CHRGDATA_TABLE);
    db.execSQL(CREATE_SETTINGS_TABLE);
    setDefaultLabel();
}

/ **
 *
 * /

公共无效setDefaultLabel(){
    //创建默认标签
    SQLiteDatabase DB = this.getWritableDatabase();
    ContentValues​​值=新ContentValues​​();
    values​​.put(KEY_NAME,默认);
    db.insert(TABLE_LABELS,空,价值观);
}
 

解决方案

试着改变你的 setDefaultLabel()方法...

 公共无效setDefaultLabel(SQLiteDatabase DB)
 

...然后在的onCreate(...)简单地传递分贝参数进去,摆脱该行...

  SQLiteDatabase DB = this.getWritableDatabase();
 

您code应该看起来像这样...

  @覆盖
公共无效的onCreate(SQLiteDatabase DB){
    //创建表
    db.execSQL(CREATE_CATEGORIES_TABLE);
    db.execSQL(CREATE_CHRGDATA_TABLE);
    db.execSQL(CREATE_SETTINGS_TABLE);
    setDefaultLabel(DB);
}

/ **
 *
 * /

公共无效setDefaultLabel(SQLiteDatabase DB){
    //创建默认标签
    ContentValues​​值=新ContentValues​​();
    values​​.put(KEY_NAME,默认);
    db.insert(TABLE_LABELS,空,价值观);
}
 

在您现有的code的问题是,的onCreate(...)正在传递一个引用到开/写的数据库,但然后调用 setDefaultLabel(...),它试图获得另一写入引用数据库。

My first time asking a question here, so be gentle, Lol.

Anyway. Ive been working on an Android and my latest build ran flawlessly.. Until yesterday, when IT gave me a new workstation. Since getting this new workstation, I keep getting the following error:

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

If it helps, I am running this in a virtual device, using platform 4.2.2 and API level 17.

I am really hoping that someone can shed some light on this error, so I can stop ripping my hair out, Lol.

If any other information is needed, please let me know.

Thanks so much,

Brad.

EDIT: Added more of the 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: Added code causing the error. setDefaultLabel() is the culprit.

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

解决方案

Try changing your setDefaultLabel() method to...

public void setDefaultLabel(SQLiteDatabase db)

...then in onCreate(...) simply pass the db parameter into it and get rid of this line...

SQLiteDatabase db = this.getWritableDatabase();

Your code should then look like this...

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

The problem in your existing code is that onCreate(...) is being passed a reference to the open / writeable database but it then calls setDefaultLabel(...) which attempts to get another writeable reference to the database.

这篇关于getDatabase递归调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆