단말기의 로컬 데이터베이스를 사용한 앱을 개발하다 보면 한번쯤은 겪게 되는것이 있다
바로 출시후 테이블 또는 필드추가, 내용추가변경이다
나도 처음에는 별생각없이 출시했다가 업데이트를 해야 하는데 디비를 바꾸어야 하는 상황이 있었다.
그래서 다 아시다시피 생성자에서의 버전을 전숫자보다 크게 넣고 onUpgrade() 에서 업데이트를 했다...
그런데 디비 버전이 한번이 아니라 여러번 바뀔경우
만약 사용자가 디비 1버전의 앱에서 사용하다가 오랬동안 사용을 안하고 곧바로 디비 3버전의 앱을 업데이트 받아 사용할경우 2버전의 디비변경사항도 적용해주어야 함을 늦게서야 깨달았다ㅎㅎ
당시에는 분명 디비 변경을 해줫는데 왜 그러나... 하고 엄청 심각했었는데 원인을 알고 나니 좀 허무했다ㅎㅎ
어잿든 아래와 같이 스위치문에 전버전숫자를 넣고 break를 뺀 구조로 해결했다~
이렇게 하면 어떤 디비 버전에서도 전 변경사항이 모두 적용됨을 확인했다^^
switch(oldVersion) {
case 1:
//2 버전의 변경내용...
case 2:
//3버전의 변경내용...
case 3:
//4버전의 변경내용...
}
끝으로 혹시나해서 이해를 돕고자 당시 문제가 되었던 그앱의 해결된 소스를 약간 변경해서 올려봐요~
private static final int DATABASE_VERSION = 4; //업데이트 할 경우 숫자를 하나씩 올려준다
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + "("
+ FIELD_ROWID + " integer primary key , "
+ FIELD_HOLESIZE + " integer , "
+ FIELD_SPEED + " integer , "
+ FIELD_VOLUME + " float , "
+ FIELD_MEDIAVOLUME + " float , "
+ FIELD_LANGUAGE + " boolean , "
+ FIELD_HIGHESTSCORE + " long , "
+ FIELD_MODE + " integer , "
+ FIELD_DLG + " text);");
//...
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
ContentValues args;
switch(oldVersion) {
case 1:
//필드 추가
db.execSQL("alter table " + TABLE_NAME + " add " + FIELD_COMBO + " integer");
//내용 추가
args = new ContentValues();
args.put(FIELD_LOCATION, location);
db.insert(TABLE_FAVORITE, null, args)
case 2:
//필드 추가
db.execSQL("alter table " + TABLE_NAME + " add " + FIELD_OBJECT + " integer");
//내용 변경
args = new ContentValues();
args.put(FIELD_APPWIDGET_UPDATECOUNT, "");
db.update(TABLE_NAME, args, FIELD_ROWID + "=" + STATE_ROWID, null);
case 3:
//필드 추가
db.execSQL("alter table " + TABLE_NAME + " add " + FIELD_MEDIAVOLUME + " float");
//테이블 추가
db.execSQL("create table " + TABLE_NAME_1 + "("
+ FIELD_ROWID + " integer primary key , "
+ FIELD_HOLESIZE + " integer , "
+ FIELD_SPEED + " integer , "
+ FIELD_VOLUME + " float , "
+ FIELD_MODE + " integer , "
+ FIELD_DLG + " text);");
}
}
}
도움이 되셨다면~ 정성으로 빚은 저희 앱! 많은 이용 바래요:)
https://meorimal.com/index.html?tab=spaceship
https://meorimal.com/subway.html
'개발 > android' 카테고리의 다른 글
[엔진없이 게임만들자] 자유자재로 오브젝트 이동시키기 (2) | 2014.04.14 |
---|---|
안드로이드에서의 가장 간단하고 확실한 칼만필터(Kalman Filter) 테스트 (14) | 2014.03.17 |
페이스북 안드로이드 sdk로 담벼락 글쓰기... 정리 2가지 (1) | 2014.01.09 |
스레드에서 View 변경시 Only the original thread…. 에러 대처법 (0) | 2013.11.25 |
배경 Layout을 손가락 터치로 따라 움직이게 하는 방법 (0) | 2013.10.08 |