티스토리 뷰
SQLite 에서 ROOM 까지 (5) - SQLite 로 생성된 기존 DB 에 column 추가하기
parkho79 2020. 8. 20. 09:24이번 포스팅에서는 SQLite 로 생성된 기존의 DB 에 column 을 새로 추가하는 방법에 대해 알아보려 한다.
기존 DB 에 column 을 추가하기 위해서는 DB version 을 upgrade 해야한다.
SQLiteOpenHelper 는 DB 를 open 할 때 기존 DB version 보다 현재 DB version 이 크다면 onUpgrade() 를 호출한다.
호출된 onUpgrade 함수에 신규 column 을 추가하면 된다.
참고로, 지난 포스팅에서는 UI, DB 생성, CRUD 을 알아 보았다.
[Android/Database] - SQLite 에서 ROOM 까지 (2) - UI 구성
[Android/Database] - SQLite 에서 ROOM 까지 (3) - SQLiteOpenHelper
[Android/Database] - SQLite 에서 ROOM 까지 (4) - SQLite 를 이용한 CRUD
DB table
하단은 예제에 사용한 DB table 이다.
노란색 배경의 나이 column 을 신규로 삽입할 것이다.
Field | Type | Property |
ID (StudentEntry._ID) |
INTEGER | primary key auto increment |
학년 (StudentEntry.GRADE) |
INTEGER | |
학번 (StudentEntry.NUMBER) |
INTEGER | |
이름 (StudentEntry.NAME) |
TEXT | |
나이 (StudentEntry.AGE) |
INTEGER |
◼ DB version upgrade
기존 DB 에 column 을 추가하고 이를 반영하기 위해서는 DB version 을 upgrade 해야한다.
◼ DB 생성 시 column 추가
신규로 app 실행 시 에서도 age column 이 추가되야 하므로 DB 생성 할 때도 column 을 추가하자.
public static final int DATABASE_VERSION = 2; | |
public static final String DATABASE_NAME = "student.db"; | |
private static final String SQL_CREATE_ENTRIES = | |
"CREATE TABLE " + StudentEntry.TABLE_NAME + " (" + | |
StudentEntry._ID + " INTEGER PRIMARY KEY," + | |
StudentEntry.GRADE + " INTEGER," + | |
StudentEntry.NUMBER + " INTEGER," + | |
StudentEntry.NAME + " TEXT," + | |
StudentEntry.AGE + " INTEGER)"; |
onUpgade 처리
위에서 설명한 것 처럼 SQLiteOpenHelper 는 DB 를 open 할 때 기존 DB version 보다 현재 DB version 이 크다면 onUpgrade() 를 호출한다.
해당 함수에서 처리하는 방식은 아래와 같이 두가지로 나눌 수 있다.
◼ 기존 data 를 버리고 신규 생성
Offline DB 를 cache 용도로 쓰고 실제 데이터는 online 에서 가져 오는 경우는 하단과 같이 기존 table 을 삭제 후 신규 테이블을 생성하면 된다.
public class PhDatabaseHelper extends SQLiteOpenHelper { | |
// If you change the database schema, you must increment the database version. | |
public static final int DATABASE_VERSION = 2; | |
public static final String DATABASE_NAME = "student.db"; | |
private static final String SQL_CREATE_ENTRIES = | |
"CREATE TABLE " + StudentEntry.TABLE_NAME + " (" + | |
StudentEntry._ID + " INTEGER PRIMARY KEY," + | |
StudentEntry.GRADE + " INTEGER," + | |
StudentEntry.NUMBER + " INTEGER," + | |
StudentEntry.NAME + " TEXT," + | |
StudentEntry.AGE + " INTEGER)"; | |
private static final String SQL_DELETE_ENTRIES = | |
"DROP TABLE IF EXISTS " + StudentEntry.TABLE_NAME; | |
public PhDatabaseHelper(Context context) { | |
super(context, DATABASE_NAME, null, DATABASE_VERSION); | |
} | |
public void onCreate(SQLiteDatabase db) { | |
db.execSQL(SQL_CREATE_ENTRIES); | |
} | |
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { | |
// This database is only a cache for online data, so its upgrade policy is | |
// to simply to discard the data and start over | |
db.execSQL(SQL_DELETE_ENTRIES); | |
onCreate(db); | |
} | |
} |
◼ 기존 data 유지하기
기존 DB 를 유지해야 하는 경우는 해당 version 에 맞춰 필요한 column 을 추가한다.
public class PhDatabaseHelper extends SQLiteOpenHelper { | |
// If you change the database schema, you must increment the database version. | |
public static final int DATABASE_VERSION = 2; | |
public static final String DATABASE_NAME = "student.db"; | |
private static final String SQL_CREATE_ENTRIES = | |
"CREATE TABLE " + StudentEntry.TABLE_NAME + " (" + | |
StudentEntry._ID + " INTEGER PRIMARY KEY," + | |
StudentEntry.GRADE + " INTEGER," + | |
StudentEntry.NUMBER + " INTEGER," + | |
StudentEntry.NAME + " TEXT," + | |
StudentEntry.AGE + " INTEGER)"; | |
public PhDatabaseHelper(Context context) { | |
super(context, DATABASE_NAME, null, DATABASE_VERSION); | |
} | |
public void onCreate(SQLiteDatabase db) { | |
db.execSQL(SQL_CREATE_ENTRIES); | |
} | |
public void onUpgrade(SQLiteDatabase a_db, int a_oldVersion, int a_newVersion) { | |
try { | |
if (a_oldVersion < 2) { | |
updateAgeColumn(a_db); | |
} | |
} catch (SQLException e) { | |
a_db.execSQL("DROP TABLE IF EXISTS " + StudentEntry.TABLE_NAME); | |
onCreate(a_db); | |
} | |
} | |
/** | |
* 나이 column 추가 | |
*/ | |
private void updateAgeColumn(SQLiteDatabase a_db) { | |
a_db.execSQL("ALTER TABLE " + StudentEntry.TABLE_NAME + " " + "ADD COLUMN " + StudentEntry.AGE + " " + "INTEGER DEFAULT " + 0); | |
} | |
} |
Source code
https://github.com/parkho79/FromSQLiteToRoom_2
'Android > Database' 카테고리의 다른 글
SQLite 에서 ROOM 까지 (7) - ROOM 이란? (0) | 2020.09.01 |
---|---|
SQLite 에서 ROOM 까지 (6) - DB 확인하기 (0) | 2020.08.25 |
SQLite 에서 ROOM 까지 (4) - SQLite 를 이용한 CRUD (0) | 2020.08.14 |
SQLite 에서 ROOM 까지 (3) - SQLiteOpenHelper 를 이용한 DB 생성 (0) | 2020.08.11 |
SQLite 에서 ROOM 까지 (2) - UI 구성 (0) | 2020.08.07 |
- Total
- Today
- Yesterday
- bindservice
- 안드로이드 인텐트
- 앱테크
- 무료채굴
- notifyDataSetChanged
- Android Service
- onContextItemSelected
- android activity flag
- 리워드 어플
- BroadcastReceiver
- StartService
- 무료 채굴
- RoomDatabase
- android task
- mPANDO
- android intent
- 앱테크 추천
- M2E
- StringUtils
- 채굴앱
- registerForContextMenu
- p2e
- task 생성
- 리워드앱
- 안드로이드 서비스
- android flag activity
- onCreateContextMenu
- Intent
- task
- WEMIX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |