티스토리 뷰
일단 기본적으로 아래 부분을 먼저 Gradle(:app) 아래 한줄을 추가해주세요.
dependencies {
...
implementation 'com.android.support:multidex:1.0.3'
...
}
아직 연습중이라 그런가 뭔가 위 줄을 먼저 추가해주는게 편하더라고요 (multidex)
Realm 을 Gradle 에 추가해줘야겠죠?
그런데 이상할정도로 추가되지 않아서 고생한 사람(이정도면 버그 수집가)
https://www.mongodb.com/docs/realm/sdk/kotlin/install/
설치 방법은 위의 사이트를 참고했습니다.
build.gradle (Project :AppName)
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'io.realm:realm-gradle-plugin:10.11.1'
}
}
plugins {
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
id "org.jetbrains.kotlin.kapt" version "1.6.20" apply false
}
build.gradle (Module :app)
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.kapt'
}
apply plugin: "realm-android"
...
dependencies {
...
implementation 'com.android.support:multidex:1.0.3'
implementation 'io.realm:realm-gradle-plugin:10.10.1'
...
}
번외
- 참고로 설치가 잘 안되시는 분들은 아래를 확인해주세요.(저는 아래같은 오류가 떴습니다.)
Caused by: org.gradle.api.GradleException: Cannot use @TaskAction annotation on method IncrementalTransformTask.transform() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method.
gradle-wrapper.properties (Project Properties)에서 'distributionUrl'을 확인해주세요.
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
여기까지가 기본 준비이고 이제 시작해봅시다.
1. MultiDexApplication 을 사용하기 위해 MyApplication 이라는 클래스를 만들고 적용해줍시다.
- 이름은 편하신 걸로 만드시면 됩니다.
class MyApplication : MultiDexApplication() {
override fun onCreate() {
super.onCreate()
}
}
2. 적용을 위해 Manifest로 이동해 적용해 줍니다. (application 밑에 적어주시면 됩니다.)
<application
android:name=".MyApplication"
3. 다시 MyApplication으로 이동해 Realm 을 추가해줍니다.
class MyApplication : MultiDexApplication() {
override fun onCreate() {
super.onCreate()
Realm.init(this) // Realm 생성
val config : RealmConfiguration = RealmConfiguration.Builder()
.name("MemberInfo.realm")
.allowWritesOnUiThread(true)
.schemaVersion(0) // migration 을 위해 추가
.deleteRealmIfMigrationNeeded()
.build()
Realm.setDefaultConfiguration(config)
}
}
4. 이제 만들어주고 싶은 데이터 형식을 만들어 줍니다. (저는 아래처럼 만들어 볼께요.)
class MemberInfo : RealmObject() {
@PrimaryKey var uniqueKey : String? = null // 각 데이터별 고유키
var name : String? = null // 맴버 이름
var age : Int = 0 // 나이
var lastUpdate : Date = Date() // 생성 날짜
}
5. 데이터를 관리하는 클래스를 따로 만들어 줍니다.
- 저는 이 방식이 편해서 이렇게 했습니다
- 저는 이름이 동일한 사람이 없다고 가정하고 만약 이름이 같은 데이터를 넣으면 덮어쓰게 만들어 볼께요.
class UtilRealm {
private var realm: Realm = Realm.getDefaultInstance()
init{
realm = Realm.getDefaultInstance()
}
// Realm 데이터 생성 (등록) & 수정
fun saveData(name:String ,age:Int){ //nowStep : 현재 총 걸음수
realm.beginTransaction() // 편집 시작
// writeDate
val realmDeviceInfo = realm.where(MemberInfo::class.java).equalTo("name", name).findFirst()
if(realmDeviceInfo != null){
// 그 객체의 걸음값 초기화
realmDeviceInfo.name = name
realmDeviceInfo.age = age
realmDeviceInfo.lastUpdate = Date()
}else{ // 아예 새로 생성
// 객체를 새로 생성
val realmObject = realm.createObject(MemberInfo::class.java,UUID.randomUUID().toString())
realmObject.apply{
realmObject.name = name
realmObject.age = age
realmObject.lastUpdate = Date()
}
realm.copyToRealmOrUpdate(realmObject)
}
// 트랜잭션 종료
realm.commitTransaction() //편집 종료
}
// Realm 데이터 검색
fun searchAge(name: String) : Int {
// 해당 이름으로 된 데이터가 있는지 확인
// 없으면 0 반환
val realmDeviceInfo = realm.where(MemberInfo::class.java).equalTo("name", name).findFirst()
return realmDeviceInfo?.age ?: 0
}
// 로그로 전체 멤버 출력
fun searchAllMember(){
val realmDeviceInfo = realm.where(MemberInfo::class.java).findAll()
for( i in realmDeviceInfo){
println(i.name + "("+i.age+")")
}
}
// Realm 데이터 삭제
fun deleteAll(){
realm.executeTransaction { realm ->
val result: RealmResults<MemberInfo> =
realm.where(MemberInfo::class.java).findAll()
result.deleteAllFromRealm()
}
}
fun deleteMember(name: String){
realm.executeTransaction { realm ->
val result: RealmResults<MemberInfo> =
realm.where(MemberInfo::class.java).equalTo("name", name).findAll()
result.deleteAllFromRealm()
}
}
}
6. 메인 엑티비티에서 호출해서 사용해볼께요.
class MainActivity : AppCompatActivity() {
// var utilRealm : UtilRealm? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val utilRealm = UtilRealm()
utilRealm?.saveData("Tomas",10)
utilRealm?.saveData("Sam",10)
utilRealm?.saveData("Ellie",14)
utilRealm?.saveData("Tomas",22)
utilRealm?.searchAllMember()
println("토마스 나이가 "+utilRealm?.searchAge("Tomas"))
utilRealm?.deleteMember("Tomas")
utilRealm?.searchAllMember()
utilRealm?.deleteAll()
}
}
7. 실제 기기에서 Realm 데이터 보기
- 삭제하는 부분을 없애고 아래처럼만 넣고 실행해볼께요.
utilRealm?.saveData("Tomas",10)
utilRealm?.saveData("Sam",10)
utilRealm?.saveData("Ellie",14)
utilRealm?.saveData("Tomas",22)
utilRealm?.saveData("Linny",50)
utilRealm?.saveData("Jon",9)
utilRealm?.saveData("Chris",30)
실행후
안드로이드 스튜디오에서
아래처럼 Device Manager 를 열어주시고 아래 사진에 표시된 버튼을 누르시면 Device File Explorer를 열수있어요.
Device File Explorer 내부에
/data/data/<PackageName>/files 로 가보시면
아래처럼 보이실텐데 해당파일을 다운로드해주세요
해당 파일은 Realm Studio 를 사용하시면 아래처럼 저장된 데이터를 확인할수있습니다.
최대한 간단히 해보려 했는데
저도 아직 익숙치 않아서 시간이 좀 걸린 것 같네요.
(+ 각종 에러)
처음 하시는 분들에게 도움이 되었으면 좋겠네요.
오늘도 파이팅입니다!
'Android 연습 > Kotlin 익숙해지기' 카테고리의 다른 글
Kotlin RecyclerView 클릭 만들기 (with kotpref) (0) | 2023.03.08 |
---|---|
Kotlin onBackPressed deprecated 발생 (0) | 2023.03.02 |
Kotlin Kotpref 이용해서 간단하게 값 저장하기 (0) | 2023.02.28 |
Kotlin 사용자 걷기(걸음수) 감지 이벤트 (0) | 2023.02.23 |
Kotlin Service 기기 재시동후에 자동 실행시키기 (0) | 2023.02.21 |