android - getReadableDatabase 递归调用获取数据库

标签 android android-sqlite sqliteopenhelper

好的,我已经解决了这里的所有问题以及许多关于创建 SQLiteDatabase 的教程。昨晚我完美地完成了这项工作,现在我收到了“递归调用数据库”错误,即使在我回滚了我的更改之后也是如此。我需要有人看一下这段代码,看看他们是否能弄明白。

辅助类:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_BACK);
    db.execSQL(CREATE_TABLE_FORWARD);
    db.execSQL(CREATE_TABLE_INWARD);
    db.execSQL(CREATE_TABLE_REVERSE);
    db.execSQL(CREATE_TABLE_TWIST);

    // call the methods to fill the dive table data
    fillForwardDives();
    fillBackDives();
    fillInwardDives();
    fillReverseDives();
    fillTwistDives();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_BACK);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_FORWARD);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_INWARD);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_REVERSE);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_TWIST);

    onCreate(db);       
}
// -------------getting all dive names for spinner--------------------------------------//
public List<String> getForwardNames(){
    List<String> diveNames = new ArrayList<String>();

    String selectQuery = "SELECT " + DIVE_NAME + " FROM " + TABLE_FORWARD;

    Log.e(LOG, selectQuery);

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, null);

    if (c.moveToFirst()){
        do{
            ForwardDB f = new ForwardDB();
            diveNames.add(f.setDiveName(c.getString(c.getColumnIndex(DIVE_NAME))));             
        }while (c.moveToNext());
    }
    c.close();
    db.close();
    return diveNames;
}

这是在主 Activity 中调用它的方法:

// Load spinner data from the SQLite database
    private void loadSpinnerData(){     
    DatabaseHelper db = new DatabaseHelper(getApplicationContext());

    List<String> diveName = db.getForwardNames();

    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, diveName);

    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
}

从我读过的所有内容来看,我知道我应该在 GetForwardNames 方法中放置一个 sqlite 参数,如下所示:getForwardNames(SQLiteDatabase db) 但是当我这样做时,我无法从主要 Activity 中正确调用它。

它在 GetForwardNames 方法的这一行结束: SQLiteDatabase db = this.getReadableDatabase();

感谢您的关注。

调用栈和其他方法:

06-12 06:42:37.843: E/AndroidRuntime(735): Caused by: java.lang.IllegalStateException:        getDatabase called recursively
06-12 06:42:37.843: E/AndroidRuntime(735):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
06-12 06:42:37.843: E/AndroidRuntime(735):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
06-12 06:42:37.843: E/AndroidRuntime(735):  at info.sqlite.helper.DatabaseHelper.getForwardNames(DatabaseHelper.java:151)
06-12 06:42:37.843: E/AndroidRuntime(735):  at info.sqlite.helper.DatabaseHelper.fillForwardDives(DatabaseHelper.java:366)
06-12 06:42:37.843: E/AndroidRuntime(735):  at info.sqlite.helper.DatabaseHelper.onCreate(DatabaseHelper.java:98)

填充数据库的填充和创建方法的代码:

private void fillForwardDives(SQLiteDatabase db) {
        ForwardDB forward1 = new ForwardDB(101, "Forward Dive", 1.4, 1.3, 1.2, 0.0, 1.6, 1.5, 1.4, 0.0);
        ForwardDB forward2 = new ForwardDB(102, "Forward Sommersault", 1.6, 1.5, 1.4, 0.0, 1.7, 1.6, 1.5, 0.0);
        ForwardDB forward3 = new ForwardDB(103, "Forward 1 1/2 Sommersaults", 0.0, 1.7, 1.6, 0.0, 1.9, 1.6, 1.5, 0.0);
        ForwardDB forward4 = new ForwardDB(104, "Forward Double Sommersaults", 0.0, 2.3, 2.2, 0.0, 0.0, 2.1, 2.0, 0.0);
        ForwardDB forward5 = new ForwardDB(105, "Forward 2 1/2 Sommersaults", 0.0, 2.6, 2.4, 0.0, 0.0, 2.4, 2.2, 0.0);
        ForwardDB forward6 = new ForwardDB(106, "Forward Triple Sommersaults", 0.0, 0.0, 2.9, 0.0, 0.0, 2.8, 2.5, 0.0);
        ForwardDB forward7 = new ForwardDB(107, "Forward 3 1/2 Sommersaults", 0.0, 0.0, 3.0, 0.0, 0.0, 3.1, 2.8, 0.0);
        ForwardDB forward8 = new ForwardDB(109, "Forward 4 1/2 Sommersaults", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.5, 0.0);
        ForwardDB forward9 = new ForwardDB(112, "Forward Flying Sommersault", 0.0, 1.7, 1.6, 0.0, 0.0, 1.8, 1.7, 0.0);
        ForwardDB forward10 = new ForwardDB(113, "Forward Flying 1 1/2    Sommersaults", 0.0, 1.9, 1.8, 0.0, 0.0, 1.8, 1.7, 0.0);
        ForwardDB forward11 = new ForwardDB(115, "Forward Flying 2 1/2 Sommersaults", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.5, 0.0);

        createForward(forward1, db);
        createForward(forward2, db);
        createForward(forward3, db);
        createForward(forward4, db);
        createForward(forward5, db);
        createForward(forward6, db);
        createForward(forward7, db);
        createForward(forward8, db);
        createForward(forward9, db);
        createForward(forward10, db);
        createForward(forward11, db);

        Log.d("Forward Count", "Forward Count: " + getForwardNames().size());   
        closeDB();
}

public void createForward(ForwardDB forward, SQLiteDatabase db) {
    //SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ID, forward.getId());
    values.put(DIVE_NAME, forward.getDiveName());
    values.put(ONE_A, forward.getOneA());
    values.put(ONE_B, forward.getOneB());
    values.put(ONE_C, forward.getOneC());
    values.put(ONE_D, forward.getOneD());
    values.put(THREE_A, forward.getThreeA());
    values.put(THREE_B, forward.getThreeB());
    values.put(THREE_C, forward.getThreeC());
    values.put(THREE_D, forward.getThreeD());

    db.insert(TABLE_FORWARD, null, values);             
}

最佳答案

您的fill...() 方法可能会调用getWritableDatabase()。您在 onCreate() 中调用 fill...() 方法,该方法由对 getWritableDatabase()getReadableDatabase 的调用触发()。这会导致递归:您正在调用 get...Database(),而之前对其的调用尚未完成。

改为使用 SQLiteDatabase 作为参数传递给 onCreate()。例如,

@Override
void onCreate(SQLiteDatabase db) {
    // ...
    fillForwardDives(db);
    //...
}

void fillForwardDives(SQLiteDatabase db) {
    // now use the passed-in db instead of calling getWritableDatabase()
}

关于android - getReadableDatabase 递归调用获取数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24175422/

相关文章:

android - aChartEngine 图从 ScrollView 顶部推开

java - SQLiteHelper 的 onCreate() 方法永远不会被调用

java - 如何将 HashMap<Integer,ArrayList<String>> 存储到 SQLite?

android - 使用 SQL 数据库自动完成 TextView

sql - 如何在sqlite中添加特定数量的空行?

java - 使用 getWritableDatabase() 时需要调用 close() 吗?

android - 如何在 Android Room 中完全重新创建我的数据库?

android - 如何更新 Android 身份验证器模块 (AbstractAccountAuthenticator)?

java - 如何使用 arraylist 填充线性布局?

android - 不写在 LogCat 中