본문 바로가기
개발/android

안드로이드 앱 런칭후 데이터베이스 변경시 주의할점

by 매몰 2014. 1. 20.

 

안드로이드 데이터베이스

 

 

단말기의 로컬 데이터베이스를 사용한 앱을 개발하다 보면 한번쯤은 겪게 되는것이 있다

바로 출시후 테이블 또는 필드추가, 내용추가변경이다

 

나도 처음에는 별생각없이 출시했다가 업데이트를 해야 하는데 디비를 바꾸어야 하는 상황이 있었다. 

 

그래서 다 아시다시피 생성자에서의 버전을 전숫자보다 크게 넣고 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);");

    }

 

}

 

}

 

 

 

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기