Android - 헬퍼 클래스로 데이터베이스 업그레이드

유의선·2023년 9월 13일
0

데이터베이스를 만드는 것 외에도 테이블의 정의가 바뀌어서 스키마를 업데이트할 필요가 있을 때에는 API에서 제공하는 헬퍼(Helper) 클래스를 사용하는 것도 좋은 방법이다.

헬퍼 클래스를 사용하려면 SQLiteOpenHelper 클래스를 사용해야 한다. SQLiteOpenHelper 클래스는 데이터베이스를 만들거나 열기 위해 필요한 작업들을 도와주는 역할을 한다.

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

첫 번째 파라미터는 Context 객체이므로 액티비티 안에서 만들 경우 this로 지정할 수 있다.

두 번째 파라미터는 데이터베이스의 이름이다.

세 번째 파라미터는 데이터 조회 시에 반환하는 커서를 만들어 낼 CursorFactory 객체이다.

네 번째 파라미터는 데이터베이스 업그레이드를 위해 사용하며 기존에 생성되어 있는 데이터베이스의 버전 정보와 다르게 지정하여 데이터베이스의 스키마나 데이터를 바꿀 수 있다.


SQLiteOpenHelper 객체를 만든다고 데이터베이스 파일이 바로 만들어지진 않는다.

데이터베이스 파일이 만들어지도록 하려면 getReadableDatabase 또는 getWritableDatabase 메소드를 호출해야 한다.
이 클래스를 이용할 때의 장점은 데이터베이스가 만들어지거나 업그레이드 할 때 콜백 메소드가 호출되는 점이다.

public abstract void onCreate(SQLiteDatabase db)
public abstract void onOpen(SQLiteDatabase db)
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

onUpgrade 메소드는 현재 데이터베이스 버전이 이미 사용하고 있는 SQLiteDatabase 파일의 버전과 다를 경우에 자동으로 호출되며,
SQLiteDatabase 객체와 함께 기존 버전 정보를 담고 있는 oldVersion, 현재 버전 정보를 담고 있는 newVersion 파리미터가 전달된다.


헬퍼 클래스 정의 후 사용하기

헬퍼 클래스를 정의해서 사용해보기 위해 데이터베이스와 테이블 만들기 에서 사용한 프로젝트를 수정해보겠다.

DatabaseHelper.java 파일을 만들고 다음 코드를 작성하였다.

package org.techtown.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {
    public static String NAME = "employee.db";
    public static int VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        println("onCreate 호출됨.");

        String sql = "create table if not exists emp("
                + " _id integer PRIMARY KEY autoincrement, "
                + " name text, "
                + " mobile text)";

        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        println("onUpgrade 호출됨 : " + oldVersion + " -> " + newVersion);

        if(newVersion > 1)
            db.execSQL("DROP TABLE IF EXISTS emp");
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        println("onOpen 호출됨.");
    }

    public void println(String data){
        Log.d("DatabaseHelper", data);
    }

}

SQLiteOpenHelper 클래스를 상속한 DatabaseHelper 클래스는 생성자에서 데이터베이스 이름과 버전 정보로 상위 클래스의 생성자를 호출한다.
super 메소드를 이용해 호출한 생성자에 전달된 CursorFactory 객체는 null 값으로 지정되어 있다.

public class DatabaseHelper extends SQLiteOpenHelper {
    public static String NAME = "employee.db";
    public static int VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, NAME, null, VERSION);
    }

데이터베이스가 생성될 때 호출되는 onCreate, 데이터베이스를 열 때 호출되는 onOpen, 데이터베이스를 업그레이드 할 때 호출되는 onUpgrade가 구현되어 있으며, onCreate 안에서 테이블을 만들도록 하였다.

@Override
    public void onCreate(SQLiteDatabase db) {
        println("onCreate 호출됨.");

        String sql = "create table if not exists emp("
                + " _id integer PRIMARY KEY autoincrement, "
                + " name text, "
                + " mobile text)";

        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        println("onUpgrade 호출됨 : " + oldVersion + " -> " + newVersion);

        if(newVersion > 1)
            db.execSQL("DROP TABLE IF EXISTS emp");
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        println("onOpen 호출됨.");
    }

이렇게 만든 헬퍼 클래스는 메인 액티비티에서 데이터베이스를 사용할 경우 코드가 더 간단해진다는 장점이 있다.


만든 헬퍼 클래스를 이용하도록 MainActivity.java 코드를 수정하였다.

public class MainActivity extends AppCompatActivity {
    EditText editText;
    EditText editText2;
    TextView textView;

    DatabaseHelper dbHelper;
    SQLiteDatabase database;
    String tableName;
    
    ...
    
        private void createDatabase(String name){
        println("createDatabase 호출됨.");

        dbHelper = new DatabaseHelper(this);
        database = dbHelper.getWritableDatabase();

        println("데이터베이스 생성함 : " + name);
    }
    
    ...

0개의 댓글