[안드로이드] SQLite를 이용한 데이터 영속화

|

안드로이드는 로컬 데이터를 관리할 때 데이터베이스로 SQLite를 사용한다. 기본적인 쿼리는 다른 데이터베이스와 거의 동일하다. 몇가지 클래스에 대해서 새로 나오기 때문에 주의깊게 보아야 한다.

SQLiteDatabase 클래스

https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase

데이터베이스의 모든 쿼리를 수행할 수 있으며 쿼리를 수행할 때 호출하는 메서드는 다음과 같다.

  • execSQL(String sql, Object[] bindaArgs) : insert, update 등 select 문이 아닌 나머지 SQL
  • rawQuery(String sql, String[] selectionArgs, Object[] bindArgs) : select SQL
db.execSQL("insert into tb_memo (title, content) values (?,?)", new String[]{title, content});

위 코드는 insert 문을 실행한 쿼리인데 ?는 다음 매개변수에서 지정할 수 있다. 개발자가 쿼리 문을 따로 지정하지 않고 정해진 쿼리를 사용할 수도 있는데 insert()delete(), update() 같은 것들이 있고 insert()update()ContentValues 객체를 매개변수로 넘기는데 key-values 형태의 데이터 집합 객체라고 생각하면 된다.

ContentValues values = new ContentValues();
values.put("name", "haram");
values.put("phone", "1234");
db.insert("USER_TB", null, values);

Cursor 인터페이스

https://developer.android.com/reference/android/database/Cursor

rawQuery 의 리턴값에 해당하는 객체로 인터페이스이다. 레퍼런스에 따르면 쿼리에 의해 리턴된 set에 대해 랜덤한 read-write 접근을 제공하는 인터페이스라고 되어 있는데 행(row)의 객체 집합 정도로 생각하면 된다. Cursor가 행을 선택하는 함수는 다음과 같다.

  • moveToNext() : 순서상으로 다음 행 선택
  • moveToFirst() : 가장 첫 번째 행 선택
  • moveToLast() : 가장 마지막 행 선택
  • moveToPrevious() : 순서상으로 이전 행 선택

Cursor를 사용할 때는 가져온 데이터베이스의 데이터를 개발자가 원하는 형태로 보여주기 위함이다. 따라서 다음과 같이 사용할 수 있는데 여기서 getString() 메서드는 열을 선택한다.

while(cursor.moveToNext){
    titleView.setText(cursor.getString(0));
    contentView.setText(cursor.getString(1));
}

SQLiteOpenHelper 추상 클래스

https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper

보통 insert나 delete와 같은 쿼리를 사용할 때는 SQLiteDatabase 클래스를 사용하고 테이블 생성이나 스키마 변경 등의 작업은 SQLiteOpenHelper 클래스를 사용한다. 추상 클래스이기 때문에 서브 클래스를 만들어서 사용해야 한다.

이 클래스가 반드시 구현해야 하는 메서드는 다음과 같다.

  • onCreate() : 앱이 설치된 후 SQLiteOpenHelper가 최초로 이용되는 순간 한 번 호출
  • onUpgrade() : 데이터베이스 버전이 변경될 때마다 호출, 업그레이드가 단조적으로 증가한다고 가정한다.
public class DBHelper extends SQLiteOpenHelper {
    // 데이터베이스 버전
    public static final int DATABASE_VERSION = 1;
    // SQLiteOpenHelper의 생성자를 호출한다.
    public DBHelper(Context context){
        super(context, "memodb", null, DATABASE_VERSION);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db){}
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){}
}