안드로이드 공부/ 간단한 Realm 사용

yellow·2021년 6월 5일
0

안드로이드 공부

목록 보기
24/28

Realm

  • 모바일 환경을 주요 타깃으로 삼은 오픈소스 DBMS
  • NoSQL 데이터베이스를 지향

NoSQL

  • 'Not Only SQL' 의 약자
  • 관계형 데이터베이스가 아닌 형태의 데이터 저장 기술을 의미하며, 관계형 데이터베이스가 가진 한계를 극복하기 위한 새로운 데이터베이스의 형태로 수평적 확장성을 가지고 있다.
  • 클라우드 환경에 맞는 저장 기술

📎 간단한 Realm 사용하기

1. Gradle 플러그인으로 설치하기

1 - 1. 프로젝트 수준에서

buildscripts{
   repositories{
        jcenter()
   }
   
   dependencies{
       classpath "io.realm:realm-gradle-plugin:10.4.0"
   }
}

allprojects{
    repositories{
        mavenCentral()
    }
}

1 - 2. 어플리케이션 수준에서

apply plugin: 'kotlin-kapt'

apply plugin: 'realm-android'

realm {
   syncEnabled = true
}

2. Realm 초기화

  • realm를 초기화하는 방식을 설정하는 config를 만들어주어야 한다.
  • realm 설정하는 방식을 더 확인하고 싶다면 공식문서를 참고하자!
  • 예시
 Realm.init(this)
// Realm 초기화 방식 설정하는 config 만들기
val config: RealmConfiguration = RealmConfiguration.Builder()
        .allowWritesOnUiThread(true) // UI Thread에서도 realm에 접근할 수 있도록 한다.
        .deleteRealmIfMigrationNeeded() // 데이터베이스의 틀에 변경사항이 생기면 저장되어있던 내용들을 모두 삭제
        .build()
        
Realm.setDefaultConfiguration(config)
  • allowWritesOnUiThread(true)
    : 원래 UI Thread에서 네트워크나 DB 관련 기능들을 수행할 수 없지만, 이 설정을 추가해주면 UI Thread에서도 realm에 접근할 수 있도록 만들어 준다.
    본인은 이 코드를 추가해주지 않아서 밑에 이미지와 같은 오류가 떴다😥

    혹시나 해서 데이터를 조작하는 코드들을 Thread{}로 감싸주는 방법도 시도해보았지만 해결되지 않았다!


3. Realm 생성

val realm = Realm.getDefaultInstance()

4. 데이터 베이스 테이블 파일 생성

  • RealmObject를 상속받는다.
  • 예제 ) 학교의 이름과 위치를 담을 수 있는 테이블 생성
package com.example.myapplication

import io.realm.RealmObject

open class School : RealmObject(){
    var name : String? = null
    var location : String? = null
}

5. 데이터 조작하기

  • 데이터를 조작하는 코드들은 작업들이 서로 충돌이 일어나서 잘못된 결과를 내놓는 것을 방지하기 위해서 realm.executeTransaction{}으로 감싸서 하나의 기능이 하나의 transaction 단위로 작동하도록 해야한다.

5 - 1. 데이터 저장하기

saveButton.setOnClickListener {
    realm.executeTransaction {
       with(it.createObject(School::class.java)) {
           this.name = "한국 대학교"
           this.location = "서울"
       }
    }
}

5 - 2. 데이터 불러오기

  • findFirst() : 첫번째 데이터 불러오기
  • findAll() : 저장된 모든 데이터 불러오기
loadButton.setOnClickListener {
    realm.executeTransaction {
        val data = it.where(School::class.java).findFirst()
    }
}

5 - 3. 데이터 삭제하기

  • deleteFromRealm() : 데이터 하나 삭제하기
  • deleteAllFromRealm() : 저장된 모든 데이터 삭제하기
deleteButton.setOnClickListener {
    realm.executeTransaction {
        it.where(School::class.java).findAll().deleteAllFromRealm() // 모든 데이터 삭제
        it.where(School::class.java).findFirst()?.deleteFromRealm() // 첫번째 데이터 삭제
    }
}
profile
할 수 있어! :)

0개의 댓글