Когда я пытаюсь вставить запись в метод 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)";