[android] SQLite Database 다루기 (초기 db file을 asset에서 copy하기)
간단한 안드로이드 프로그램을 만들면서.. DB를 컨트롤 할일이 있었다.
그냥 DB에서 지점정보를 읽어와서 지도에 출력해주는.. 사용자가 Data를 입출력하는 일도 없구.. 그냥 저장된 자료를 읽어와서 뿌리기만 하면 되는..
일단 기본적으로 DB컨트롤 하는 class는 다음 강좌를 참고했다.
http://overoid.tistory.com/20
http://overoid.tistory.com/21
(참고로.. 처음 안드로이드 프로그래밍을 시작하면서. .많은 도움을 받았던 사이트다.. ^^ )
기본 개념은 SQLiteOpenHelper를 상속받아 DatabaseHelper를 만들되.. 여러 Activity에서 접속해도 문제가 발생하지 않도록 Singleton으로 만들고..
이마저도.. 테이블 별로 DAO를 만들어서.. 그 안에서 DatabaseHelper를 사용하도록.. (실 Activity에서 사용할때는 DAO만 생성해서 사용하면 된다.)
또 재사용에 용이하도록 기본 DBHelper클래스와 DBCreator, DAO 등으로 쪼개놓아 새로운 프로젝트 개발시.. 필요한 부분만 수정하게끔 해놓았다.
읽어봤을때.. 괜찮은 방식인것 같아서.. 이 방식으로 구현하기로 결정.
다만.. 사용해보니.. 여기서는 초기자료가 적어서..
DBCreator클래스 안에.. 생성문(쿼리)을 선언해놨다가..
DatabaseHelper의 onCreate() 실행시.. 쿼리문을 실행해주는데..
나는.. 초기값이 많아서, 쿼리문으로 만들긴 힘들고.. 이미 만들어놓은 db파일을 asset에 넣어놨다가.. 복사하는 방식으로 구현.
그냥 DatabaseHelper의 생성자에서.. 해당 DB가 없으면.. asset에 있는 파일을 복사해주는 방식으로 구현.
하다보니.. 잘 작동하긴 하는데…
조금 아쉬운게.. DB파일이 변경되서 asset에 import했는데.. 실행할때 DB가 없을때에만 복사를 해두니.. 변경된 DB파일이 적용이 안됨.
에뮬에서 앱을 삭제했다가 다시 설치해야 변경된 DB파일이 적용됨.
물론 테스트야 그렇게 하면되는데.. 나중에 배포할때는 골치아파질것 같음.
SQLiteOpenHelper가 필요한 경우 onCreate()나.. onUpgrade()를 자동으로 호출해주니.. 거기서 처리해주면 좋겠는데..
onCreate()에서 파일 복사를 해봤는데… 이미 DB가 열려있어서(DB를 열때 DB가 없으면 onCreate()가 실행되는듯.) Lock이 걸려서 오류..
그래서.. 자료좀 찾아보다가.. 아래의 자료를 발견했다.
http://blog.kdehairy.com/2012/08/19/using-a-preloaded-sqlite-database-with-sqliteopenhelper/
기본 개념은.. 역시나 singleton으로 구현하고..
생성자에서 파일복사를 담당하긴 하는데…
파일복사가 필요한지 확인해보기 위해 DB를 한번 열었다 닫음.
(DB를 열면.. 필요한경우 onCreate()나 onUpgrade()가 실행됨)
onCreate()나 onUpgrade()가 실행되면.. 거기서 실행됐다고 flag채크. (mInvaildDatabaseFile = true)
mInvaildDatabaseFile이 true면.. database파일 복사하고.. database버전 세팅하고.. mInvaildDatabaseFile를 false로 셋팅.
자세한 사항(소스 포함)은 위의 링크를 참고하시기 바람..
혹 궁금한거 물어보면.. 내가 아는 사항이면 알려줄수도.. ^^;;;