[해결] 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로 …. 이전 값 보다 높은 숫자를 적용한다.