[안드로이드] 내장 DB로 Realm 사용하기
슥삭을 개발하면서 내장 DB를 써야 할 일이 생겼다. 아니 사실은 그 전부터 쓸 일은 많았는데, 미루고 미루다가 드디어 적용했다!
안드로이드에서 사용할 수 있는 내장 DB의 종류는 꽤 많은데, 내가 Realm을 선택한 이유는 정말 간단하다.
✨Realm을 선택한 이유 ✨
- 데이터를 객체 형태로 저장한다. (쿼리문 싫어,,,)
- 커뮤니티가 활발하다. (구글링 열심히 하자!)
자 이제 realm을 사용해보자.
0. 설치하기
아래 코드를 프로젝트 수준 build.gradle에 추가한다.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:3.5.0"
}
}
다음 코드를 애플리케이션 수준 build.gradle에 추가한다.
apply plugin: 'realm-android'
anroid {
realm {
syncEnabled = true
}
}
이렇게 두개만 추가하면 realm 설치 끝 ❗️
1. Realm 초기화하기
Realm.init()으로 Realm을 초기화할 수 있다.
초기화는 realm을 사용하고자 하는 Activity에서 해도 되지만, 한번만 초기화하면 되므로 Application 클래스에서 초기화를 해주었다.
class SsgSagApplication : Application(){
override fun onCreate(){
super.onCreate()
Realm.init(this)
val config : RealmConfiguration = RealmConfiguration.Builder()
.name("appdb.realm") // 생성할 realm 파일 이름 지정
.deleteRealmIfMigrationNeeded()
.build()
Realm.setDefaultConfiguration(config)
}
🚫 해당 Application class는 manifests에 꼭 등록해주어야한다 ! 🚫
2. Model 만들기
데이터를 저장하는 Realm 모델 클래스는 RealmObject 를 상속받아서 생성해야한다.
앱을 깔고 로그인한 뒤 한번 저장된 후 바뀔일이 크게 없는 device 정보를 내장 DB에 저장해놓으려 한다.
이를 위해 아래와 같은 class를 만들었다.
open class DeviceInfo : RealmObject(){
var id : Int = 0
var token =""
var loginType: Int = 0
var uuid =""
}
👉Realm의 모델에 관한 다양한 정보를 더 얻고 싶다면 아래의 링크에 들어가보자.
https://realm.io/kr/docs/java/latest/#models
3. Realm 가져오기
이제 Realm을 사용하고 싶은 곳에서 Realm을 가져와서 사용할 수 있다.
lateinit var realm : Realm
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
realm = Realm.getDefaultInstance()
}
원하는 값은 메소드를 이용해서 가져올 수 있다.
val realmDeviceInfo = realm.where(DeviceInfo::class.java).equalTo("id", 1 as Int).findFirst()
👉 DeviceInfo 클래스에서 id가 1인 첫번째 데이터를 가져와서 realmDeviceInfo에 저장한다.
4. Realm에 데이터 저장하기
데이터 저장은 꼭! 트랜잭션 안에서 이루어져야 한다.
fun setDeviceInfoUuid(uuid : String){
// 트랜잭션 시작
realm.beginTransaction()
// id가 1인 DeviceInfo를 가져온다.
val realmDeviceInfo = realm.where(DeviceInfo::class.java).equalTo("id", 1 as Int).findFirst()
// id가 1인 DeviceInfo 객체가 이미 존재한다면
if(realmDeviceInfo != null){
// 그 객체의 uuid값 초기화
realmDeviceInfo.uuid = uuid
}else{ // id가 1인 DeviceInfo 객체가 존재하지 않는다면
// 객체를 새로 생성
val realmObject = realm.createObject(DeviceInfo::class.java)
realmObject.apply{
this.id = 1
this.uuid = uuid
}
}
// 트랜잭션 종료
realm.commitTransaction()
}
위 코드에서 이미 존재하는 객체의 값을 수정하는 것과 객체를 새로 만드는 경우를 모두 볼 수 있다.
간단하게 Realm 사용법을 알아보았다!
'내장 DB'를 딱 들으면 왠지 어려울 것 같아서 미루다가 꼭 필요해져서 사용해보았는데, 생각한 것 보다 쉽게 사용할 수 있는 것 같다.
물론 위에서 본 것 처럼 트랜잭션 때문에 멀티스레딩을 하기 까다롭다는 단점이 있긴하지만, 간단하게 사용하려면 쉽게 접근할 수 있고 한국어로 사용법이 친절하게 나와있다는 장점 때문에 사용해볼만 한 것 같다!
곧 다른 프로젝트를 사용해보려고 하는데, 거기서는 다른 걸 써보고 한번 비교해봐야지 😊