-2

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

Tin Tin
  • 13
  • 4

1 Answers1

0

execute create table query in your dbHelper's onCreate method to create table...and then it will try to fetch data from table

p0.execSQL("Create table todos (blah,blah,blah)")
Rohit Chauhan
  • 1,119
  • 1
  • 12
  • 30
  • m not able to access CMD_CREATE_TABLE in onCreate pleaase help .. and can u please write the code – Tin Tin Jul 14 '18 at 17:15