Daily-Wine-Diary

アプリ開発中心

MENU

【Android】SQLiteDB 更新時の no such table:  エラー対策

自作メモアプリ(Notepad)開発中に Tableを新たに1つ追加した際に、 no such table: ○○(テーブル名) エラーが出てしまいちょっとハマりました。
結論から言うと私は1つ勘違いをしていました。



結論


SqLiteOpenHelperonCreate
database.getWritableDatabase() 呼び出し時にではなく、新規作成時に呼ばれる。

Activityの onCreate のイメージを持っていたので、毎回実行されるものと勘違いし、 あれ?create tableできないなーと悩んでいました。(私だけかな?)

対策


元の状態

class userDB_Helper(var mContext: Context?) : SQLiteOpenHelper(mContext, "Makimono_db", null, 10000) {

    override fun onCreate(database: SQLiteDatabase?) { //新規生成時のみ呼ばれる!!!
        //最初からあったTable
        database?.execSQL("create table if not exists ReviewTable " +
                "(id int primary key, " +
                "isreview int, " +
                "day int)")
        //開発中に必要になり、後から追加したTable
        database?.execSQL("create table if not exists SettingsTable " +
                "(id int primary key, " +
                "fontsize int, " +
                "theme int)")
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { // バージョンが上がった時に実行される
        
    }

    override fun onDowngrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { // バージョンが下がった時に実行される
        
    }

}


対策後

class userDB_Helper(var mContext: Context?) : SQLiteOpenHelper(mContext, "Makimono_db", null, 10001) { //バージョンを上げた

    override fun onCreate(database: SQLiteDatabase?) { //新規生成時のみ呼ばれる!!!
        //最初からあったTable
        database?.execSQL("create table if not exists ReviewTable " +
                "(id int primary key, " +
                "isreview int, " +
                "day int)")
        //開発中に必要になり、後から追加したTable
        database?.execSQL("create table if not exists SettingsTable " +
                "(id int primary key, " +
                "fontsize int, " +
                "theme int)")
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { // バージョンが上がった時に実行される
        
        //こちらに追加した
        database?.execSQL("create table if not exists SettingsTable " +
                "(id int primary key, " +
                "fontsize int, " +
                "theme int)")

    }

    override fun onDowngrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { // バージョンが下がった時に実行される
       
    }

}


といった感じで、 onUpgrade の方に追加し、バージョンを上げたら無事追加されました。 アプリの更新時などに気を付けないと引っかかっちゃいそうですね。