getDatabase called recursively when insert a record in oCreate of my DbHelper class

孤街醉人 提交于 2020-01-23 08:24:06

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!