android - 递归调用getDatabase

标签 android

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

无论如何。我一直在 Android 上工作,我的最新版本运行完美。直到昨天,IT 给了我一个新工作站。自从获得这个新工作站后,我不断收到以下错误:

04-11 17:34:53.282: E/AndroidRuntime(789): java.lang.RuntimeException: 无法启动 Activity 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): 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);
}

最佳答案

尝试将您的 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(...) 尝试获取对数据库的另一个可写引用。

关于android - 递归调用getDatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15955799/

相关文章:

android - 如何衡量我的应用程序的数据使用情况

java - 将设备从 Android 8 更新到 9 后无法从 Android Studio 启动应用

android - 使用 Lambda 更新可组合函数

android - 如何禁用 Android 评分栏中的拖动功能

android - 如何将 HTML 文件(存储在 Assets 中)转换为 android 中的图像?

android - 在运行时调整布局大小时内容闪烁

android - 使用Room时如何加密数据库?

android - 如何在android中的webview中打开桌面站点

java - 添加几个具有不同配置的 appWidgets?

android - 如何在android中创建JSON格式的数据?