GetDatabase вызывается рекурсивно при вставке записи в oCreate моего класса DbHelper

Когда я пытаюсь вставить запись в метод onCreate моего класса DbHelper, который расширен из SQLiteOpenHelper, эта ошибка будет увеличена.
Я нашел несколько подобных тем:
Android getDatabase называется рекурсивно
GetWritableDatabase, называемая рекурсивно
GetDatabase называется рекурсивно, но они не помогут мне.

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

Ошибка будет поднята, когда эта строка кода хочет выполнить:

 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 

Что мне делать?

Кажется, у вас есть собственный метод insert() . Вероятно, он вызывает getWritableDatabase() который вызывает getDatabase() и он выкинет это исключение, поскольку onCreate() уже вызывается в контексте getDatabase() . Просто используйте db.insert() где db – объект SQLiteDatabase переданный вашему onCreate() , без вызова getWritableDatabase() . Это по сути та же проблема и решение, что и во всех трех связанных с вами вопросах.

Раньше у вашего вопроса была другая, предыдущая проблема, решение которой ниже, с исправлением insert() сверху:

В таблице нет имен столбцов, которые вы указываете в ContentValues .

В CREATE TABLE settings указаны только столбцы name и value но вы пытаетесь вставить данные в столбцы Username , Password и personId .

Также полезно регистрировать полные стеки стека исключений (а не только сообщение) и читать исключения, где бы вы их не регистрировали.

Если я правильно понимаю ваше намерение, вам нужны три пары пар имя-значение, например:

 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); 

Или таблицы с одной строкой и данными столбцами:

 sql = "CREATE TABLE IF NOT EXISTS settings (Username text,Password text,personId)"; 
Intereting Posts