Whenever i try to run my app it closes with error no such table todos..
MainActivity.kt
package com.vineet.tododatabase
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ArrayAdapter
import com.vineet.tododatabase.db.MyDbHelper
import com.vineet.tododatabase.db.TodoTable
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
val todos = ArrayList<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val todosAdapter = ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
todos
)
val db = MyDbHelper(this).writableDatabase
lvItems.adapter = todosAdapter
fun refreshTodoList(){
val todoList = TodoTable.getAllTodos(db)
Log.d("TODOS", todoList.toString())
}
btnAdd.setOnClickListener {
val newTodo= Todo(
etTask.text.toString(),
false
)
TodoTable.insertTodos(db, newTodo)
refreshTodoList()
}
}
}
MyDbHelper.kt
package com.vineet.tododatabase.db
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class MyDbHelper(context: Context): SQLiteOpenHelper(
context,
"todos.db",
null,
1
){
override fun onCreate(p0: SQLiteDatabase?) {
}
override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {
}
}
TodoTable.kt
package com.vineet.tododatabase.db
import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase
import com.vineet.tododatabase.Todo
object TodoTable{
val TABLE_NAME = "todos"
object Columns{
val ID = "id"
val TASK = "task"
val DONE = "done"
}
val CMD_CREATE_TABLE = """
CREATE TABLE IF NOT EXIST $TABLE_NAME
(
${Columns.ID} INTEGER PRIMARY KEY AUTOINCREMENT,
${Columns.TASK} TEXT,
${Columns.DONE} BOOLEAN
);
""".trimIndent()
fun insertTodos(db: SQLiteDatabase, todo: Todo){
val row = ContentValues()
row.put(Columns.TASK, todo.task)
row.put(Columns.DONE, todo.done)
db.insert(TABLE_NAME,null, row)
}
fun getAllTodos(db: SQLiteDatabase): ArrayList<Todo>{
val todos = ArrayList<Todo>()
var c = db.query(
TABLE_NAME,
arrayOf(Columns.ID, Columns.TASK, Columns.DONE),
null, null,
null, null,
null
)
while (c.moveToNext()){
var todo = Todo(c.getString(1), c.getInt(2) == 1)
todos.add(todo)
}
return todos
}
}
models.kt
package com.vineet.tododatabase
data class Todo(var task: String, var done: Boolean)
i dont know why i am getting this error
E/SQLiteLog: (1) no such table: todos E/SQLiteDatabase: Error inserting task=gg done=false android.database.sqlite.SQLiteException: no such table: todos (code 1): , while compiling: INSERT INTO todos(task,done) VALUES (?,?) at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1546) at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1417) at com.vineet.tododatabase.db.TodoTable.insertTodos(TodoTable.kt:30) at com.vineet.tododatabase.MainActivity$onCreate$2.onClick(MainActivity.kt:40) at android.view.View.performClick(View.java:6294) at android.view.View$PerformClick.run(View.java:24770) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) E/SQLiteLog: (1) no such table: todos