问题
When I'm trying to insert a record in onCreate method of my DbHelper class which is extended from SQLiteOpenHelper, this error will be rised.
I've found some similar topics like these:
Android getDatabase called recursively
getWritableDatabase called recursively
getDatabase called recursively
but these are not going to help me.
public class DbHelper extends SQLiteOpenHelper{
public int x=0;
public DbHelper(Context context) {
super(context, "shareholders.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
sql = "CREATE TABLE IF NOT EXISTS settings (name text,value text)";
Log.d("Ehsan", sql);
db.execSQL(sql);
ContentValues cv = new ContentValues();
cv.put("name", "Username");
cv.put("value", "");
insert("settings", cv);
cv.put("name", "Password");
cv.put("value", "");
insert("settings", cv);
cv.put("name", "PersonId");
cv.put("value", "");
insert("settings", cv);
} catch (Exception e) {
xLog.error(e.getMessage());
}
}
public long insert(String table,ContentValues cv){
SQLiteDatabase mydb =this.getWritableDatabase();
return mydb.insert(table,null, cv);
}
}
the error will be raised when this line of code wants to execute:
insert("settings", cv);
Log Cat:
11-10 11:46:53.325: W/dalvikvm(19579): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
11-10 11:46:53.325: E/AndroidRuntime(19579): FATAL EXCEPTION: main
11-10 11:46:53.325: E/AndroidRuntime(19579): java.lang.IllegalStateException: Could not execute method of the activity
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.view.View$1.onClick(View.java:3599)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.view.View.performClick(View.java:4204)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.view.View$PerformClick.run(View.java:17355)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.os.Handler.handleCallback(Handler.java:725)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.os.Handler.dispatchMessage(Handler.java:92)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.os.Looper.loop(Looper.java:137)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.app.ActivityThread.main(ActivityThread.java:5041)
11-10 11:46:53.325: E/AndroidRuntime(19579): at java.lang.reflect.Method.invokeNative(Native Method)
11-10 11:46:53.325: E/AndroidRuntime(19579): at java.lang.reflect.Method.invoke(Method.java:511)
11-10 11:46:53.325: E/AndroidRuntime(19579): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-10 11:46:53.325: E/AndroidRuntime(19579): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-10 11:46:53.325: E/AndroidRuntime(19579): at dalvik.system.NativeStart.main(Native Method)
11-10 11:46:53.325: E/AndroidRuntime(19579): Caused by: java.lang.reflect.InvocationTargetException
11-10 11:46:53.325: E/AndroidRuntime(19579): at java.lang.reflect.Method.invokeNative(Native Method)
11-10 11:46:53.325: E/AndroidRuntime(19579): at java.lang.reflect.Method.invoke(Method.java:511)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.view.View$1.onClick(View.java:3594)
11-10 11:46:53.325: E/AndroidRuntime(19579): ... 11 more
11-10 11:46:53.325: E/AndroidRuntime(19579): Caused by: java.lang.IllegalStateException: getDatabase called recursively
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
11-10 11:46:53.325: E/AndroidRuntime(19579): at ClassLibrary.DbHelper.insert(DbHelper.java:76)
11-10 11:46:53.325: E/AndroidRuntime(19579): at ClassLibrary.DbHelper.onCreate(DbHelper.java:56)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
11-10 11:46:53.325: E/AndroidRuntime(19579): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
11-10 11:46:53.325: E/AndroidRuntime(19579): at ClassLibrary.DbHelper.insert(DbHelper.java:76)
11-10 11:46:53.325: E/AndroidRuntime(19579): at com.example.shareholders.entities.Person.insert(Person.java:99)
11-10 11:46:53.325: E/AndroidRuntime(19579): at com.example.shareholders.Sync.doSync2(Sync.java:71)
11-10 11:46:53.325: E/AndroidRuntime(19579): at com.example.shareholders.AppMenu.clickHandler(AppMenu.java:56)
11-10 11:46:53.325: E/AndroidRuntime(19579): ... 14 more
What should I do?
回答1:
You seem to have a custom insert()
method. It likely calls getWritableDatabase()
which calls getDatabase()
and it will throw this exception since onCreate()
is already called in the context of getDatabase()
. Just use db.insert()
directly where db
is the SQLiteDatabase
object passed to your onCreate()
, without calling getWritableDatabase()
. This is essentially the same issue and solution as in all the three questions you linked.
Previously your question had another, prior problem the solution to which is below, with the insert()
fix from above included:
Your table does not have the column names you specify in ContentValues
.
There's only name
and value
columns specified in the CREATE TABLE settings
but you're trying to insert data into columns Username
, Password
and personId
.
It's also useful to log full exception stack traces (and not just the message), and to read the exceptions wherever you log them.
If I understand your intent correctly, you want either three name-value pair rows like this:
ContentValues cv = new ContentValues();
cv.put("name", "Username");
cv.put("value", "");
db.insert("settings", cv);
cv.clear();
cv.put("name", "Password");
cv.put("value", "");
db.insert("settings", cv);
cv.clear();
cv.put("name", "personId");
cv.put("value", "");
db.insert("settings", cv);
or a table with single row and the given columns:
sql = "CREATE TABLE IF NOT EXISTS settings (Username text,Password text,personId)";
来源:https://stackoverflow.com/questions/19889103/getdatabase-called-recursively-when-insert-a-record-in-ocreate-of-my-dbhelper-cl