[ 새로운 짤방이다. 신선하다. ]
한두시간 정도 별별 로그를 다 찍고 삽질을 하다가, 인터넷 찾아보고 알게 된 거다.
그러니까... 보통 안드로이드에서 객체가 생성될때는, 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() 에 때려박는게
나같은 삽질을 안 할 가능성이 높다.
끝.
'프로그램 > 안드로이드' 카테고리의 다른 글
알서포트의 모비즌 프로그램을 PC에 설치하면, 안드로이드 VM (AVD ) 가 안돌아간다. (0) | 2014.12.03 |
---|---|
SQLite 에서, insert() 의 반환값은 lastInsertId() 와 같은 역할을 한다. (0) | 2014.11.24 |
안드로이드 + sqlite 에서, long 은 integer 로 동작한다. (0) | 2014.11.17 |
안드로이드에서 카메라 지정할 때, 카메라가 1개일때랑 2개일때랑 다르다. (1) | 2014.11.09 |
뭬라? 이클립스의 appcompat 디렉토리를 지웠단 말이더냐? (2) | 2014.09.02 |