1
2

More than 3 years have passed since last update.

Kotlin : Realmを用いてcsvファイルをセットする

Last updated at Posted at 2021-02-20

はじめに

Realmのデータベースを用いたデモアプリを作成していたとき、データベースが空の状態で登録や削除を行っていましたが、予めcsvファイルをセットしておく方法も試したので、忘れないように残そうと思います。

build.gradleの設定

projectレベルのbuild.gradleを開き、以下の文をclasspathに加えます。

classpath "io.realm:realm-gradle-plugin:10.2.0"

次にapplicationレベルのbuild.gradleを開き、以下のpluginを適用します。

id 'realm-android'

ここで、言語がkotlinである場合は以下のpluginを適用する必要があります。このpluginは上記の'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ファイルを作成
    2021-02-20 (16).png

  • realmファイルができないとき(Error : Failed to import data)
    2021-02-20 (21).png
    保存したcsvファイルをメモ帳で開き文字コードをUTF-8にしてからrealmファイルを作るとうまくいくことがあります

realmファイルをAndroid Studioに取り込む

2021-02-20 (6).png
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>

Error

2021-02-20 (23).png
上記のようなエラーが出た場合は以下の文を追加することで消えました。

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に下げることで消えました。
(間違った方法でしたら申し訳ありません。こちらを参考にしました)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2