티스토리 뷰

728x90



이번 포스팅에서는 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



728x90
댓글