1

Okay, so I've gone over all the question here as well as many of the tutorials out there about creating an SQLiteDatabase. Last night I had this working perfectly and now today I am getting the "Get Database called recursively" error, even after I rolled back my changes. I need someone to please take a look at this code and see if they can figure it out.

Helper Class:

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

And this is the method calling it in the main 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);
}

From everything I've read I know I should be placing a sqlite parameter in the GetForwardNames method, like so: getForwardNames(SQLiteDatabase db) but when I do it can't call it correctly from the main activity.

It dies on this line in the GetForwardNames method: SQLiteDatabase db = this.getReadableDatabase();

Thanks for looking.

Call stack and other methods:

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)

Code for my fill and create methods to populate the db:

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);             
}
Jeremey
  • 13
  • 4

1 Answers1

3

Your fill...() methods likely call getWritableDatabase(). You call the fill...() methods in onCreate() that is triggered by a call to getWritableDatabase() or getReadableDatabase(). That causes the recursion: you're calling get...Database() while a previous call to it has not yet completed.

Use the SQLiteDatabase passed in as an argument to onCreate() instead. For example,

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

void fillForwardDives(SQLiteDatabase db) {
    // now use the passed-in db instead of calling getWritableDatabase()
}
laalto
  • 150,114
  • 66
  • 286
  • 303