본문 바로가기
Android/Concepts

SQLiteOpenHelper 사용하여 DB 수정하기

by JuHy_ 2020. 5. 1.

SQLiteOpenHelper란?

많은 수의 사용자가 사용하고 있어 저장된 데이터의 양이 많을 때, 테이블을 수정하려면 어떻게 해야 할까?

사용중인 테이블의 column을 수정하거나 테이블을 삭제하는 것은 어려운 작업이다.

 

SQLiteOpenHelper는 이런 상황에서 테이블의 수정, 삭제를 도와준다.

새로운 기능을 앱에 추가하려 테이블 구조와 코드를 수정했는데, 사용자가 앱을 업데이트 하지 않았다면 수정된 테이블과 테이블에 접근하는 코드가 맞지 않아 오류가 발생할 수 있다.

 

이 때 SQLiteOpenHelper를 통해 버전 관리를 해 코드 상태에 맞춰 db 구조를 변경할 수 있다.

 

예를 들어 DB와 소스코드를 모두 version1에서 version2로 수정했을 때,

SQLiteOpenHelper를 통해 현재 코드 버전이 version1이라면 DB를 version2로 수정하지 않고,

현재 코드 버전이 version2일 때에만 DB를 version2로 수정하도록 구현할 수 있다.

 

이 글에서 DB 접속에 사용된 코드에 대한 설명은 아래 글에서 미리 읽고 참고하면 된다.

https://ju-hy.tistory.com/70

 

SQLite DB에 데이터 저장하기

Database란? 어플리케이션의 데이터를 저장할 때 서버를 통해 저장할 수도 있지만, 기기에 저장할 수도 있다. 안드로이드에서는 SharedPreference를 사용하여 (key,value) 형태로 데이터를 저장할 수 있는 기능을..

ju-hy.tistory.com

 

사용법

class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        println("onCreate() called");

        String tableName = "customer";
        if(db != null){
            String sql = "CREATE TABLE " + tableName + "("
                    + "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + "name TEXT,"
                    + "age INT,"
                    + "mobile TEXT"
                    + ")";
            db.execSQL(sql);
            println("table created");
        } else {
            println("open database first");
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        println("onUpgrade() called: " + oldVersion + " / " + newVersion);

        // 1 -> 2 로 바뀐 경우
        if(newVersion > 1){
            String tableName = "customer";
            db.execSQL("DROP TABLE IF EXISTS " + tableName);
            println(tableName + " table deleted");
        }
    }
}

SQLiteOpenHelper를 사용하기 위해선 SQLiteOpenHelper 클래스를 상속받아 클래스를 정의해주면 된다.

클래스 내부에는 생성자, onCreate(), onUpgrade()를 구현해주어야 한다.

 

onCreate()는 사용중인 DB가 없을 때 호출되고,

onUpdate()는 사용중인 코드의 버전이 바뀐 경우 호출된다.

 

위 코드는 사용자 DB가 없을 경우(onCreate) table을 생성하고,

새로운 버전이 발견되면(onUpgrade) table을 삭제하도록 구현하였다.

 

파라미터의 newVersion 변수를 통해 현재 버전이 어떤 버전인지 알려주기 때문에,

if문을 통해 newVersion 변수를 확인하여 현재 버전에 맞는 코드를 수행하도록 나누어주면 된다.

 

※ database 객체는 파라미터로 넘어온 객체를 사용한다.

 

public void openDatabase(String databaseName){
    println("openDatabase() called");
    DatabaseHelper helper = new DatabaseHelper(this, databaseName, null, 1);
    database = helper.getWritableDatabase();
}

클래스를 모두 정의했다면 객체를 생성하자.

생성자에는 context, db명, factory, version 정보를 넣어주면 된다.

 

여기서 지정한 version 정보가 onUpgrade()의 파라미터인 newVersion 변수를 통해 전달된다.

소스코드를 db에 맞춰 수정했다면 이 숫자를 올려 소스코드가 업데이트된 것을 알리고 db를 수정하도록 하면 된다.

 

그리고 getWritableDatabase()를 호출하면 상황에 맞는 메소드가 실행되며 database 객체를 넘겨받을 수 있다.

 

 

이제 확인을 위해 version 1로 한번 실행하고 종료한 뒤 version 2로 다시 실행해보자.

 

처음 실행했을 때(version 1)는 onCreate()가 호출되어 table이 생성되었고,

두 번째 실행했을 때(version 2)는 onUpgrade()가 호출되어 table이 삭제된 것을 볼 수 있다.

 

 

Reference

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android