KotlinでRealm利用【Modelとデータ作成】

前回Realmの利用準備が整ったので実際に使っていきます。必要なものは

・Model(モデル)

・データの作成、読み込み、編集、削除の処理です

 

Modelというのは所謂SQLでのテーブルのことですね。

これをソースコード上で作成する必要があるので、そのために

Modelというクラスファイルを作成し、そこにテーブルの定義を書きます。

 

 

クラスファイルを新規作成してModelの名前をつけます。

(テーブル名を名前にするので私はBoardとしました)

そしてModel用のクラスにするにはRealmObjectのサブクラスにします。

 

//Board.ktファイルの中身。importとpackageは省いています。

open class Board : RealmObject(){
    @PrimaryKey
    var id: Long = 0 // id
    @Required
    var name: String = ""  // ボードの名前
    var date: Date = Date() // 日付
    var memos: RealmList<Memo> = RealmList() // メモのリレーション
}

見てもらえば分かると思いますが、

主キーには@Primaryというアノテーションを付けます。

そしてNULL値となってはいけないフィールドには@Requiredの

アノテーションを使用して入力を必須にすることができます!

 

 

これであとはデータを作成や編集、削除したいところでその処理を書きますが、

ここではデータの作成部分だけ書くことにします。

 

 

データの作成ですが、作成用のボタンを押したときにデータを

新規登録するというようにしたので、簡易的にコードを書きますが

以下のようにします。(… は省略です。)

//メンバ変数
private lateinit var mRealm: Realm

override fun onCreate(savedInstanceState: Bundle?) {
   ...
   //ボタンを押したときに作成
   createButton.setOnClickListener { 
       ...
       //ボードデータ新規作成
    createBoard(editView)
   }
}

 

上の メソッドcreateBoardでデータを作成しています。(↓)

 

fun createBoard(editView : EditText){
    mRealm.executeTransaction {

        // Auto Increment機能がないのでIDの最大値を取得してくる
        val max = mRealm.where<Board>().max("id")
        var newId: Long = 0
        if (max != null) {//nullチェック
            newId = max.toLong() + 1
        }

        //新規Board作成 IDを入れる。
        val board: Board = mRealm.createObject<Board>(primaryKeyValue = newId)

        // データ挿入
        board.name = editView.text.toString()
        board.date = Date()
    }
}

 

順にみていきたいのですが、まずKotlinを勉強しててnullに対して

安全な対策が取られている言語ということは分かったのですが、

じゃあメンバ変数を宣言する際に、同時に初期化しないようにするには

どうしたらいいんだろうとなりました。

 

調べたところvarの前にlateinitを付けるということでした。

Lateinitとは

NonNullなプロパティーの初期化をconstructorより後に遅らせられる機能

(https://blog.takuji31.jp/entry/2018/02/09/135107

 

valには使えない等制約もあるようですが、問題なく使えそうです。

従って、以下のようにRealmクラスのインスタンスを宣言しました。

private lateinit var mRealm: Realm

 

 

コードの順通りではなく、話が前後しますが、

まずデータの作成をトランザクションで行うので、

RealmのexecuteTransaction内で以下のように

 //新規Board作成 IDを入れる。
 val board: Board = mRealm.createObject<Board>(primaryKeyValue = newId)

 // データ挿入
 board.name = editView.text.toString()
 board.date = Date()

createObjectでBoardのオブジェクトを作成し、作成と同時に

primarykeyのidにnewIdの値を入れています。

 

それからドットで各カラムを指定できるので、

board.nameとboard.dateに入れたい値を挿入しています。

 

コードを見ていただければわかりますが、

実はRealmはオートインクリメント機能がないので、

自分でその設定をしてやる必要があります。

 

 

設定と言ってもデータを新しく作成時に

・既存のデータのidの最大値を取得してそれに+1する

だけですね!

 

// Auto Increment機能がないのでIDの最大値を取得してくる
val max = mRealm.where<Board>().max("id")
var newId: Long = 0
if (max != null) {//nullチェック
    newId = max.toLong() + 1
}

whereでModelを指定し、その後に検索条件を書きます。

ここではidの最大値を取得するのでmax()メソッドを利用し、カラムidを指定します。

それから+1したのを新しいnewIdに入れています。

 

 

nullチェックというのは、一番最初にデータを作るときは

データを検索しても何もなく取得できませんので、nullが返ってきます。

そのときはidを0番目する、という初期用の処理ですね。

 

 

以上がデータ作成の手順です。

 

データの読み込みや更新は、whereを使って取得したいものを

取得してきて、同じようにカラムに代入とかするだけですし、

データ削除もメソッド一つで出来ます!

 

Realm凄く使いやすいです…笑

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です