본문 바로가기
Programming/Android

8장.DBMS를 이용한 데이터 영속화

by jaegom 2020. 5. 29.

*데이터의 영구적 지속

SQLite

-네트워크 상태가 아닐 때 stand-alone으로 데이터를 다룰 수 있는 안드로이드 내장 DBMS

-SQLiteDatabase클래스의 함수를 이용

1. SQLiteDatabase db = openOrCreateDatabase("이름", MODE_PRIVATE, null);

2.

db.execSQL(String) : insert, update가 아닌 SQL문

db.rawQuery(String, String[], Object[]) : select문 // 반환값이 Cursor 클래스 (row의 집합 객체)

ex) Cursor cursor = db.rawQuery(~, null);

while (cursor.moveToNext() ) { ~.cursor.getString(0) } // 행 선택 후 getString으로 열 선택

 

-SQLiteOpenHelper 추상클래스 : 테이블 생성이나 스키마 변경, 상속 받는 서브 클래스 생성

*onCreate와 onUpgrade 재정의 필수

*서브클래스의 생성자  super(context, 'db이름', null, DATABASE_VERSION);

1. 

public class DBHelper extends SQLiteOpenHelper {

  public static final int DATABASE_VERSION = 1;

  pulbic DBHelper(Context context) {

    super(context, 'db이름', null, DATABASE_VERSION);

  }

  @Override

  public void onCreate(SQLiteDatabase db) {} //db 생성 시 호출

  @Override

  public void onUpgrade(~) {} //db 버전 변경 시 호출, 변경 없으면 호출 X

}

ex)

DBHelper helper = new DBHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

 

-쿼리문

-insert(), query(), update(), delete() 함수를 직접 이용할 수 있다.

-execSQL()이나 rawQuery()는 SQL문을 직접 매개변수로 줘야하지만, 위의 함수들은 자료만 주면 알아서 SQL문을 생성해준다.

-insert()와 update()는 ContentValues 클래스(insert, update 데이터를 표현하는 집합 객체)를 매개변수로 넘긴다. key-value형식으로 이용되며 key 값이 실제 테이블의 열(column)에 해당한다.

ex)

삽입하기 : ( insert(String table, String nullColumnHack, ContentValues values) )

ContentValues values = new ContentValues();

values.put('name', 'kkang');

values.put('phone', '01012344321');

db.insert('db이름', null, values);

ex)

불러오기 : ( query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) )

Cursor c = db.query("db이름",  new String[] {"name", "phone"}, "ID=?", new String[] {"kkang"},

null, null, null); // group by, having, order by

 

-Realm을 이용한 데이터 영속화

-로컬 데이터베이스, android 표준은 아니고 realm.io에서 배포하는 오픈소스 DBMS

-ORM(Object Relational Mapping)을 제공한다. -> 객체를 RDBMS(관계형 데이터베이스)에 Mapping(적용)해주는 기능

-SQLite보다 빠르다.

-dependencies { classpath "io.realm:real-gradle-plugin:3.5.0"}, apply plugin: 'realm-android'

 

-Realm 사용 예시

1. VO(Value-Object) 클래스 생성 (다룰 객체의 클래스, 데이터 저장만을 위한 클래스이다.)

ex) public class MemoVO extends RealmObject {

  public String title;

  public String content;

} //private 선언 후 자료를 getter/setter로 설정해도 무방

*RealmObject를 상속받은 객체를 Realm이 자동 해석하여 데이터 저장하거나 데이터로 객체를 생성한다.

2. Realm 객체 생성

ex

Realm.init(this);

Realm mRealm = Realm.getDefaultInstance();

3. 저장

mRealm.executeTransaction(new Realm.Transaction() ) {

  @Override

  public void execute(Realm realm) {

    MemoVO vo = realm.createObject(MemoVO.class);

    vo.title = title;

    vo.content = content;

  }

});

4. 저장한 데이터 획득

MemoVO vo = mRealm.where(MemoVO.class).equalTo("title", "hello").findFirst();

//클래스가 MemoVO.class이면서 title값이 hello인 데이터 중 첫 번째(findFirst(); ) 데이터를 가져와 vo에 세팅한다.

*mRealm.where()의 반환 객체는 RealmQuery이며, 이 객체에서 findFirst() 말고도 데이터를 추출할 수 있는 다양한 함수 존재. ex) findAllSorted("title", Sort.DESCENDING);

*데이터가 여러 건이면 RealmResults 타입을 이용

RealmResults<MemoVO> results = mRealm.where(Memo.class).equalTo("title", "hello").findAll();

 

 

댓글