Ошибка в моей первой таблице в котлине

Я столкнулся с проблемой, когда пытаюсь вставить столбец в базу данных с помощью Kotlin в Android.

Это ошибка:

08-04 19: 45: 03.781 14302-14302 / com.example.hello.note E / Zygote: v2 08-04 19: 45: 03.781 14302-14302 / com.example.hello.note E / Zygote: accessInfo: 0 08-04 19: 45: 20.471 14302-14302 / com.example.hello.note E / Qmage: isQIO: поток не является файлом QIO ​​08-04 19: 45: 20.521 14302-14302 / com.example.hello.note E / Qmage: isQIO: поток не является файлом QIO ​​08-04 19: 45: 20.531 14302-14302 / com.example.hello.note E / Qmage: isQIO: stream не является файлом QIO ​​08-04 19:45: 20.541 14302-14302 / com.example.hello.note E / MotionRecognitionManager: mSContextService = null 08-04 19: 45: 20.541 14302-14302 / com.example.hello.note E / MotionRecognitionManager: motionService = com.samsung.android. motion.IMotionRecognitionService$Stub$Proxy@78b77 08-04 19: 45: 47.991 14302-14302 / com.example.hello.note E / Qmage: isQIO: поток не является файлом QIO ​​08-04 19: 45: 47.991 14302- 14302 / com.example.hello.note E / Qmage: isQIO: поток не является файлом QIO ​​08-04 19: 45: 47.991 14302-14302 / com.example.hello.note E / Qmage: isQIO: поток не является QIO-файл 08-0 4 19: 47: 40.311 14302-14302 / com.example.hello.note E / Qmage: isQIO: поток не является файлом QIO ​​08-04 19: 48: 14.131 14302-14302 / com.example.hello.note E / SQLiteLog: (1) нет такой таблицы: Примечания 08-04 19: 48: 14.141 14302-14302 / com.example.hello.note E / SQLiteDatabase: Ошибка вставки Title = note Desc = desc android.database.sqlite.SQLiteException: no такая таблица: Примечания (код 1): при компиляции: INSERT INTO Notes (Title, Desc) VALUES (?,?) ####################### ########################################### Код ошибки: 1 (SQLITE_ERROR) Причиненный По: Ошибка SQL (запрос) или отсутствующая база данных. (нет такой таблицы: Примечания (код 1): при компиляции: INSERT INTO Notes (Title, Desc) VALUES (?,?)) #################### ######################################################### на базе android.database. sqlite.SQLiteConnection.nativePrepareStatement (собственный метод) в файле android.database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection.java:1004) в android.database.sqlite.SQLiteConnection.prepare (SQLiteConnection.java:569) в файле android.database.sqlite. SQLiteSession.prepare (SQLiteSession.java:588) в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:59) в android.database.sqlite.SQLiteStatement. (SQLiteStatement.java:31) в android.database.sqlite.SQLiteDatabase .insertWithOnConflict (SQLiteDatabase.java:1633) в файле android.database.sqlite.SQLiteDatabase.insert (SQLiteDatabase.java:1505) в com.example.hello.note.DbManger.Insert (DbManger.kt: 40) в com.example. hello.note.addNotes.buAdd (addNotes.kt: 24) в java.lang.reflect.Method.invoke (собственный метод) в файле android.support.v7.app.AppCompatViewInflat er $ DeclaredOnClickListener.onClick (AppCompatViewInflater.java:288) в android.view.View.performClick (View.java:5721) в файле android.widget.TextView.performClick (TextView.java:10931) в android.view.View $ PerformClick .run (View.java:22620) на android.os.Handler.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper. java: 148) в android.app.ActivityThread.main (ActivityThread.java:7409) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit. java: 1230) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Код базы данных:

class DbManger(context: Context) { val dbName = "MyNotes" val dbTable = "Notes" val colID = "ID" val colTitle = "Title" val colDesc = "Desc" var dbVer = 4 val sqlCreateTable = "CREATE TABLE IF NOT EXISTS " + dbTable + "(" + colID + " INTEGER PRIMARY KEY," + colTitle + " TEXT," + colDesc + " TEXT " + ");" var sqlDataBase: SQLiteDatabase? = null inner class dbHelperNotes : SQLiteOpenHelper { var context: Context? = null constructor(context: Context) : super(context, dbName, null, dbVer) { this.context = context } override fun onCreate(p0: SQLiteDatabase?) { p0!!.execSQL(sqlCreateTable) Toast.makeText(this.context, "Database is created", Toast.LENGTH_LONG).show() } override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) { p0!!.execSQL("drop table IF EXISTS " + dbTable) } } fun Insert(values: ContentValues): Long { val ID = sqlDataBase!!.insert(dbTable, "", values) return ID } init { var db = dbHelperNotes(context) sqlDataBase = db.writableDatabase } } 

@laalto прав, вам нужно заново создать таблицу, как только вы ее сбросили, вам нужно добавить вызов onCreate(p0) внутри вашего onUpgrade() .


Я удалил несколько ненужных полей в вашем классе, вот как это выглядит сейчас:

 class DbManger(context: Context) { val dbName = "MyNotes" val dbTable = "Notes" val colID = "ID" val colTitle = "Title" val colDesc = "Desc" var dbVer = 4 val sqlCreateTable = "CREATE TABLE IF NOT EXISTS $dbTable($colID INTEGER PRIMARY KEY,$colTitle TEXT,$colDesc TEXT);" var sqlDataBase: SQLiteDatabase? = null inner class dbHelperNotes(val context: Context) : SQLiteOpenHelper(context, dbName, null, dbVer) { override fun onCreate(database: SQLiteDatabase?) { database?.execSQL(sqlCreateTable) Toast.makeText(context, "Database is created", Toast.LENGTH_LONG).show() } override fun onUpgrade(database: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { database?.execSQL("drop table IF EXISTS " + dbTable) onCreate(database) } } fun insert(values: ContentValues): Long { val id = sqlDataBase!!.insert(dbTable, "", values) return id } init { val db = dbHelperNotes(context) sqlDataBase = db.writableDatabase } } 

Я считаю, что у вас также есть опечатка на имя вашего класса, должно быть «DbManager».

Ваша версия базы данных уже в 4, но ваш onUpgrade просто отбрасывает таблицу, но не создает необходимые таблицы.

Если вы хотите обновлять потери данных, вы можете просто вызвать onCreate в onUpgrade после onUpgrade старых таблиц. Или во время разработки часто бывает проще удалить и переустановить приложение. См. Когда выполняется SQLiteOpenHelper onCreate () / onUpgrade ()? больше о том, как работает SQLiteOpenHelper .