프로그램/안드로이드

안드로이드에서 SQLite 를 사용할 때, SQLiteOpenHelper 의 onCreate()는, 앱 설치할 때 최초 한번만 실행된다.

(주)CKBcorp., 2014. 11. 20. 05:00
반응형



[ 새로운 짤방이다. 신선하다. ]


한두시간 정도 별별 로그를 다 찍고 삽질을 하다가, 인터넷 찾아보고 알게 된 거다.

그러니까... 보통 안드로이드에서 객체가 생성될때는,  Constructor 나 onCreate() 를 거치잖아.

그런데 SqLiteOpenHelper() 는 onCreate() 에 아무리 로그를 박아 넣어 봐도, 안 거치는 거다.

이게 웃긴게... 혹시나 해서 생성자( Constructor ) 에 박아 넣은 로그는 잘 나오는데, onCreate() 에 넣은거만 안 나왔다.


맨첨엔 내가 무슨 코드를 잘 못 짠 줄 알고 엄청 고민했는데, 뭔가 이상해서 검토해 보니, 


onCreate() 가 실행되는 조건은 


1. getWritableDatabase() 혹은 getWritableDatabase() 가 실행될 때

2. 시스템 안에 open 으로 지정한 db 파일이 없다면


실행된다. 

즉, "정말로 시스템 안에 디비가 없을 때 딱 한 번" 실행되는 거임.


그렇기 때문에, 


3. 테이블을 새로 추가하거나 구조를 변경했다면,

4. 당연히 onCreate() 에서 해결하려 하지 말고

5. onUpdate() 에서 해결하고 디비 버전을 올려야 된다.


하지만... 서비스 운영중인 apk 도 아니고, 개발중인 시스템에서  누가 onUpdate() 쓸 생각을 하냐? 

즉, 처음부터 "Android 의 SQLite onCreate() 는 로컬에 디비가 없을때만 실행된다." 는 걸 모르는 상태에서는, 이 버그의 악순환에서 빠져나올 방법이 없다.




그러므로, SQLite 관련 테스트나 코드 작성시에는, 

매 Acitvity 실행시마다 명시적으로 DB 를 모조리 날리고 다시 만드는 함수를 적용해 개발하는 게 오히려 나을 수 있다.

즉, SQLiteOpenHelper 의 onCreate() 에 db.execSQL()  로 TABLE create 하지 말고,

그냥 Main Activity 의 onCreate() 에 이전 db 모두 날리고 새로 db를 생성하게 해서 매번 디비 만들고 테스트 들어가게 한 다음,

코드 완성 + 테스트 완성되면 그때 Main Activity 의 table create 코드를 SQLiteOpenHelper() 의 onCreate() 에 때려박는게 

나같은 삽질을 안 할 가능성이 높다.


끝.




 


반응형