요약 :


SQLiteOpenHelper를 여러 개 사용하는 경우 같은 이름의 데이터베이스 파일을 사용하지 말 것.



-----


상황 :


내 어플리케이션에는 SQLiteOpenHelper를 상속받는 MessageDBHelper 클래스가 있었다.


이 클래스에서는 message.db파일을 생성하며 onCreate() 메서드 내부에서는 msg라는 테이블을 만들고,


바깥에서는 MessageDBHelper의 getReadableDatabase() 혹은 getWritableDatabase() 메서드를 사용하여 해당


테이블에 접근, 데이터를 insert 하거나 select.. 등등의 일들을 수행하고 있었다.


그런데, 이 상황에서 데이터베이스에 다른 데이터들을 추가적으로 저장할 필요가 생겨, 기존의 message.db 파일


내에 setting이라는 추가적인 테이블을 만들고 거기에다가 데이터들을 보관하려고 했다. 다음과 같이.


SettingsDBHelper mHelper;

SQLiteDatabase db;


mHelper = new SettingsDBHelper(this, "message.db", null, 1);


db = mHelper.getReadableDatabase();


.....


(Note. MessageDBHelper 대신 SettingsDBHelper를 추가로 만들어 사용하려고 했던 점이 문제의 원인)



이런식으로 코드를 작성했으나 무슨 이유에서인지 SQLiteOpenHelper을 상속받는 SettingsDBHelper 클래스의


onCreate 메서드가 절대로 호출되지 않고, (따라서 테이블을 생성하는 sql 구문이 실행되지 않고) 이후의 select나


insert, update.. 등과 같은 sql 구문을 실행할 때 no such table이라는 에러가 발생하는 것이었다.



문제의 원인 :


같은 데이터베이스 파일에 다른 테이블을 추가로 생성하려고 했던 상황에서, 이를 처리하기 위해 별도의 SQLiteOpen


Helper(나의 경우 SettingsDBHelper)를 추가적으로 만든 것이 잘못이었다.


SQLiteOpenHelper 클래스의 onCreate() 메서드는 데이터베이스 파일이 존재하지 않는 상황에서, 막 만들어지려는


시점에 호출된다. 나의 경우는 이미 어플리케이션에서 MessageDBHelper 클래스가 message.db 파일을 만들고


그 안에 msg 테이블을 생성해 사용하고 있었으므로, 같은 message.db 파일을 만들고 그 안에 setting 테이블을 만


들어 사용하려는 SettingsDBHelper 클래스의 onCreate() 메서드는 당연히 호출될 수 없었던 것이다.


(즉, MessageDBHelper 클래스나 SettingsDBHelper 클래스 둘 중 하나의 onCreate()는 호출될 수 없음)


(참고로 덧붙이자면, SQLiteOpenHelper 클래스의 onCreate() 메서드는 SQLiteOpenHelper 객체가 생성되는 시점


에 호출되지 않고, getWritableDatabase() 메서드나 getReadableDatabase() 메서드를 통해 데이터베이스 파일을


오픈하려고 할 때 호출되는 콜백함수라고 한다.)



해결 방법 :


나의 경우 일단 SettingsDBHelper가 사용할 데이터베이스 파일의 이름을 settings.db로 새로 만들고 그 안에 테이블


을 생성하게끔 해서 문제를 해결했다. 만약 하나의 데이터베이스 파일 안에 여러 개의 테이블을 두는 형태로 사용하고


다면 SQLiteOpenHelper를 상속받는 기존 클래스의 onCreate() 메서드 안에서 테이블을 여러개 만들고, 그 객체의


getReadableDatabase()나 getWritableDatabase() 메서드를 이용해서 db파일에 접근하는 형태로 사용하면 될 것이


다.


(테스트 해보진 않았다. 난 여러 개의 SQLiteOpenHelper 클래스를 사용하고 싶었으므로 --> 사실 귀찮아서)



레퍼런스 :


http://stackoverflow.com/questions/21881992/when-is-sqliteopenhelper-oncreate-onupgrade-run




p.s ) 이 문제로 3~4시간 정도를 삽질했다. 혹시 나와 같은 실수를 한 사람이 이 글을 봤으면 좋겠다.






Posted by huammmm1
,