Android

[해결] android.database.sqlite.SQLiteException: no such column은 왜 발생하는가?

 

SQLite 데이터베이스를 사용하여 테이블을 생성하였다.  테이블 생성 스크립트는 다음과 같다.

Create table문를 사용하여 만들었다.

    public static void createTableMyNumber(SQLiteDatabase database){
        try {
            if(database != null){
                database.execSQL("CREATE TABLE if not exists TB_NUMBER ("
                        + "event_id integer PRIMARY KEY autoincrement"
                        +",_event_date VARCHAR(10)"// 등록일자 yyyy.mm.dd
                        +",_my_number_1 integer"
                        +",_my_number_2 integer"
                        +",_my_number_3 integer"
                        +",_my_number_4 integer"
                        +",_my_number_5 integer"
                        +",_my_number_6 integer"
                        +",_is_delete integer"
                        +",_reg_type integer"
                        +");");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    

그런데 아래와 같은 오류가 발생하였다.
  android.database.sqlite.SQLiteException: no such column: _reg_type (code 1 SQLITE_ERROR): , while compiling: SELECT event_id , _event_date, _my_number_1, _my_number_2, _my_number_3, _my_number_4, _my_number_5, _my_number_6, _reg_type FROM TB_LOTTO_MY_NUMBER  WHERE _is_delete= 1 ORDER BY _event_date DESC
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:986)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:593)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
        at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:61)
        at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1443)
        at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1382)
        at com.app.hi.database.DataBaseUtil.selectMyNumberList(DataBaseUtil.java:100)
        at com.app.hi.ui.home.HomeFragment$selectMyNumbersTask.doInBackground(HomeFragment.java:385)
        at com.app.hi.ui.home.HomeFragment$selectMyNumbersTask.doInBackground(HomeFragment.java:358)
        at android.os.AsyncTask$3.call(AsyncTask.java:378)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

분명히 _reg_type 칼럼은 존재한다. 그럼에도 불구하고 칼럼을 찾을 수 없는 오류가 발생한다면 이유는 하나이다.
테이블 최초 생성시 _reg_type 칼럼은 생성하지 않았고 추후 추가한 칼럼일 가능성이 100%이다.

이런 경우 기존에 설치된 앱에는 적용되지않는다.해결방법은 두 가지 방법이 존재한다.데이터베이스 버전을 업데이트 해주거나 기존앱을 삭제하고 다시 빌드하면 된다. 데이터베이스 버전 업데이트 방법은 아래와 같다. 나만의 SQLiteOpenHelper를 하나 만들었다.

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "hi.db";
    private static final int DATABASE_VERSION = 2;

    public FcmSQLiteOpenHelper(@Nullable Context context, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASE_NAME, factory, version);
    }

    public FcmSQLiteOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public FcmSQLiteOpenHelper(Context context, SQLiteDatabase.CursorFactory factory) {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        DataBaseUtil.createTablehistory(db); //DATABASE_CREATE
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.disableWriteAheadLogging();
    }

DATABASE_VERSION 값을 변경해줘야한다. 기존 값이 1이었다면 2로 …. 이전 값 보다 높은 숫자를 적용한다.

Leave a Reply

error: Content is protected !!