1. 시작하며
대체 저의 커리어가 어떻게 돼가는것인지 잘 모르겠습니다만..
최근에 안드로이드 공부를 시작했습니다.
안드로이드 앱을 만들때면 거의 필수적으로 앱 내장 DB를 사용해야 합니다.
이때 sqlite 같은 기본 솔루션을 쓸 수도 있겠지만 좀 더 쉬운 툴이 있으면 그것을 써야겠죠.
쉽게 설명하자면 안드로이드 내장DB에서 사용되는 ORM 이라고 보시면 됩니다.
java, spring 을 잘 아시는 서버개발자 분들께서는 JPA가 생각나실겁니다.
공식 홈페이지(https://realm.io/kr/)의 설명에 따르면..
Realm DB로 모바일앱 데이터 저장을 뚝딱뚝딱 만들수 있고,
자바, 스위프트, 오브젝티브C, 자바스크립트 등등에서 쓸 수 있대네요
2. 사용법
거두절미하고 어떻게 사용하는지 아주 간략히 정리하겠습니다.
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
...
...
classpath "io.realm:realm-gradle-plugin:5.2.0"
}
프로젝트 레벨의 build.gradle 파일에 realm 관련 플러그인을 넣어 봅시다.
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
...
apply plugin: 'realm-android'
다음은 app 레벨의 build.gradle 인데요. 위와같이 realm-android를 추가해줍시다.
그 후 android studio 메뉴 중 [File] - [Re-Import Gradle Project]를 눌러줍시다.
저는 어떤 비디오를 "좋아요" 하는 객체를 저장한다는 가정을 세웠습니다.
따라서 Like 클래스를 아래와 같이 만들었습니다. (kotlin 이에요)
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import java.util.Date
open class Like(
@PrimaryKey var id: Long = 0,
var videoId: String? = null,
var date: Date? = null
) : RealmObject()
필요한 필드들을 constructor 에 선언해 주었습니다.
특별한것은 PK로 사용할 필드를 @PrimaryKey 어노테이션으로 마킹한 것과
RealmObject 클래스를 상속받았다는 점 입니다.
class MainActivity : AppCompatActivity() {
...
var realm: Realm
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Realm.init(this)
realm = Realm.getDefaultInstance()
...
}
...
override fun onDestroy() {
super.onDestroy()
realm.close()
}
}
그리고 Realm.init을 해줘야하는데요 전 그냥 메인이되는 액티비티에다가 넣어줬습니다.
onDestroy 안에다가 close 하는것도 넣어줍시다.
addButton.setOnClickListener {
realm.beginTransaction()
val currentId = realm.where<Like>(Like::class.java).max("id")
val nextId = if (currentId == null) 1 else currentId.toInt() + 1
val newObject = realm.createObject<Like>(nextId)
newObject.videoId = "video-$nextId"
newObject.date = Date()
realm.commitTransaction()
Toast.makeText(context, "인서트 했어요", Toast.LENGTH_SHORT).show()
}
액티비티나 프래그먼트에서 getDefaultInstance를 통해 수행 객체를 들고옵니다.
그 후 위처럼 트랜잭션을 열고, 데이터를 설정하고, 트랜잭션을 커밋하면 끝입니다.
정말 안타까운 점은 PK에 Auto-Increment 속성을 걸 수 없는것 이었습니다.
따라서 위처럼 마지막 id를 가져와서 +1을 해주는 작업을 해줘야 합니다.
(진짜 없는것인지 아닌진 모르겠습니다. 문서를 아직 다 안읽어봤거든요)
val all = realm.where(Like::class.java).findAll()
잘 들어갔는지 확인할 때는 위처럼 findAll 메소드를 이용하면 됩니다.
3. 마치며
사실 전 서버 개발자라서 이렇게 하는게 정답인가는 잘 모르겠습니다.
좀 내용이 부실하다는 생각이 들긴 하지만 기본은 이정도 인것 같네요.
이제 realm 객체를 통해 어떤 쿼리를 날릴것인지 공식 문서나 많은 예제들을 통해 학습하면 되겠습니다.
'테크 노트 > 소소한 개발 팁' 카테고리의 다른 글
android, 앱 출시하려는데 keystore 잃어버렸을 때 (1) | 2019.03.28 |
---|---|
github, src refspec master does not match any ... (0) | 2019.03.20 |
spring, aop 특정 조건에서 실행 제외하기 (0) | 2019.03.15 |
github, 여러 repository에 대해 ssh 설정 하기 (0) | 2019.03.14 |
예쁘게 코드 공유하기 (2) | 2019.03.12 |