好的,我已经解决了这里的所有问题以及许多关于创建 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/