본문 바로가기

Android/개념 및 예제

Realm를 사용해서 안드로이드 앱에 데이터 저장하기

Realm이란?

  • Realm은 https://realm.io에서 오픈소스로 만들어지고 있는 로컬 데이터베이스이다.
  • Realm은 자바 객체를 해석해 그 객체의 데이터를 그대로 데이터베이스에 저장, 획득한다.
  • Realm이 ORM을 제공한다는 것이 SQLite와 비교했을 때 가장 큰 차이이다.
  • Realm은 안드로이드뿐만 아니라 다양한 곳에서 데이터베이스로 사용된다.
  • 표준 라이브러리가 아니므로 플러그인 방식으로 이용해야 함

Realm를 사용해서 안드로이드 앱에서 데이터를 저장하기, 가져오기, 삭제하기에 대해 다뤄보겠습니다.

 

Realm 플러그인 설치를 위한 의존성 설정

build.gradle(project)

5.6.0 버전으로 빌드하고 앱 실행 시 에러가 발생했습니다.

하위 버전과 관련된 이슈가 있습니다.

buildscript {
	dependencies {
		classpath "io.realm:realm-gradle-plugin:6.1.0"
	}
}

build.gradle (Module)

kotlin-kapt를 설치 안하면 Configuration with name 'kapt' not found 오류가 발생합니다.

plugins {
	id 'kotlin-kapt'
	id 'realm-android'
}

 

Value-Object 클래스 만들기

VO 객체의 변수 데이터를 Realm이 자동 해석해 데이터를 저장하거나, 저장된 데이터로 객체를 만들어 줍니다.

class MemoVO: RealmObject() {
    val title;
    val content;
}

 

데이터 저장하기

Realm을 실행하려면 Realm.Transaction 인터페이스를 구현한 클래스를 만들어 줘야 합니다.

이 클래스의 객체를 executeTransaction() 함수의 매개변수로 주면 execute() 함수가 자동 실행되는 구조입니다.

// Realm 객체만들기
Realm.init(this)
val mRealm = Realm.getDefaultInstance()
// 메모 데이터 저장하기
mRealm.executeTransaction { realm ->
    val vo: MemoVO = realm.createObject(
        MemoVO::class.java)
    vo.title = title
    vo.content = content
}

 

데이터 가져오기

findFrist를 통해 데이터를 가져옵니다.

title 값에 부합하는 데이터를 MemoVO 객체의 변수에 세팅합니다.

val mRealm = Realm.getDefaultInstance()
val vo = mRealm.where(MemoVO::class.java).equalTo("title", title).findFirst()

mRealm.where(MemoVO::class.java)을 통해 반환되는 객체는 RealmQuery이며, 이 객체에서 데이터를 획득하기 위한 다양한 findXXX 함수를 제공합니다.

 

  • findAll()
  • findAllSorted(String fieldName)
  • findAllSorted(String[] fieldNames, Sort[] sortOrders)
  • findAllSorted(String fieldName, Sort sortOrder)
  • findAllSorted(String fieldName1, Sort sortOrder1, String fieldName2, Sort sortOrder2)
  • findFirst()
조건을 명시할 때 equalTo( ) 함수 이외에 between( ), beginsWith( ), endsWith( ), isNotNull( ), in( ), isNull( ), lessThan ( ), lessThanOrEqualTo( ), contains(), like( ) 등의 다양한 함수를 제공합니다.

 

데이터 삭제

val mRealm = Realm.getDefaultInstance()
val vo = mRealm.where(MemoVO::class.java).equalTo("title", "hello").findFirst()
vo.deleteFromRealm()

 

모든 데이터 삭제

mRealm.delete(MemoVO.class)