Kotlin : Realm을 사용하여 csv 파일 설정

소개



Realm의 데이타베이스를 이용한 데모 앱을 작성하고 있을 때, 데이타베이스가 비어 있는 상태로 등록이나 삭제를 실시하고 있었습니다만, 미리 csv 파일을 세트 해 두는 방법도 시도했으므로, 잊지 않게 남기자 라고 생각합니다.

build.gradle 설정



프로젝트 레벨 build.gradle을 열고 다음 문장을 classpath에 추가하십시오.
classpath "io.realm:realm-gradle-plugin:10.2.0"

그런 다음 application 레벨 build.gradle을 열고 다음 플러그인을 적용합니다.
id 'realm-android'

여기서 언어가 kotlin이면 다음 플러그인을 적용해야합니다. 이 플러그인은 위의 'realm-android'보다 위에 배치하십시오.
id 'kotlin-kapt'

자세한 방법은 여기

Realm 초기화



그런 다음 Realm을 초기화합니다.
초기화하고 싶은 것을 쓰는 클래스에 Application 클래스가 있어, 이 Application 클래스를 상속한 새로운 클래스를 작성해, 그 안에서 초기화를 실시합니다.

NewActivity.kt
package com.example.databasecsv

import android.app.Application
import io.realm.Realm

class NewActivity : Application() {

    override fun onCreate() {
        super.onCreate()

        //Realmの初期化
        Realm.init(this)
    }
}

모델 클래스 만들기



데이터베이스 프레임워크를 클래스로 설정합니다.

이전과 마찬가지로 새 클래스를 만들고 RealmObject 클래스를 상속하고 클래스를 열 수 있습니다.
작성한 클래스 내에서 데이터베이스의 필드(열)를 설정합니다.

ExDB.kt
package com.example.databasecsv

import io.realm.RealmObject

open class ExDB : RealmObject() {

    //フィールドの設定
    var exQuestion : String? = null
    var exAnswer : String? = null

}

준비


  • 설정할 CSV 파일 준비
    이때 파일의 이름은 모델 클래스(ExDB)와 같고, 필드도 모델 클래스에서 선언한 것(exQuestion이나 exAnswer)과 같게 합니다.
  • Realm Studio 설치
    위의 링크에서 다운로드 한 후 다음과 같이 설정 한 CSV 파일에서 realm 파일을 만듭니다.
  • realm 파일을 사용할 수 없는 경우(Error : Failed to import data)

    저장된 CSV 파일을 메모장에서 열고 문자 코드를 UTF-8로 만든 다음 realm 파일을 만들면 작동 할 수 있습니다.

    realm 파일을 Android Studio로 가져오기




    Assets 폴더를 만들고 여기에 이전 realm 파일(test.realm)을 배치합니다.
    배치한 후 Realm 초기화 아래에 다음 설정을 추가합니다.

    NewActivity.kt
    val config = RealmConfiguration.Builder().assetFile("test.realm").build()
    Realm.setDefaultConfiguration(config)
    

    목록 표시



    MainActivity.kt
    package com.example.databasecsv
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.widget.ArrayAdapter
    import io.realm.Realm
    import io.realm.RealmResults
    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
    
        lateinit var realm : Realm
        lateinit var results : RealmResults<ExDB>
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }
    
        override fun onResume() {
            super.onResume()
    
            realm = Realm.getDefaultInstance()
    
            results = realm.where(ExDB::class.java).findAll().sort(getString(R.string.db_field_question))
    
            val wordlist = ArrayList<String>()
    
            results.forEach{
                wordlist.add(it.exAnswer + " : " + it.exQuestion)
            }
    
            val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, wordlist)
            listView.adapter = adapter
    
            }
    
        override fun onPause() {
            super.onPause()
    
            realm.close()
        }
    
    

    strings.xml
    <string name="db_field_question">exQuestion</string>
    

    오류




    위와 같은 오류가 발생하면 다음 문장을 추가하여 사라졌습니다.

    strings.xml
    <application
            //省略
            android:name=".NewActivity">
            //省略
    </application>
    

    Execution failed for task ':app:kaptDebugKotlin'.
    A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
    java.lang.reflect.InvocationTargetException (no error message)

    이 오류는 좀처럼 사라지지 않았지만 kotlin 버전을 1.4.20> 1.3.50으로 낮추면 사라졌습니다.
    (잘못된 방법이라면 죄송합니다. 여기 을 참고했습니다)
  • 좋은 웹페이지 즐겨찾기