diadia

興味があることをやってみる。自分のメモを残しておきます。

Realmの使い方について

メモ

参考:

https://realm.io/docs/java/6.0.2/

[Android] SQLiteをやめてRealmを使ってみた

イメージ

ORM?みたいに扱うイメージ。 djangoのModelを定義するように、RealmObjectを継承したクラスを定義し、メソッドでUpdateしたり参照したりする感じ。

実装手順は以下の通り。

  1. インストール
  2. realmオブジェクトの初期化
  3. マニフェストファイルのapplicationタグのname属性にクラス名を定める
  4. モデルクラスの作成
  5. CRUDコードを記述

インストール

https://realm.io/docs/java/6.0.2/#getting-started

projectのbuild.gradleでまず下記をdependenciesに記述する。

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

次にappのbuild.gradleで以下を追加する。

apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'

realmオブジェクトの初期化

Applicationクラスを継承したクラスにrealmを初期化する記述を書く。

//ファイル名をMyApplication.ktにする

object MyApplication:Application(){
  override fun onCreate(){
    super().onCreate()
    Realm.init(this)
  }
}

マニフェストファイルのapplicationタグのname属性を定める

   <application
        android:name=".MyApplication"> //上記のファイルを追加する

モデルクラスの作成

モデルクラスを作成するには、RealmObjectを継承したクラスを定義する。 そしてフィールドをアトリビュートとして記述する。

注意点はRealmObjectの継承時に" open class "で継承を行うことである。

open class MyModel:RealmObject(){
  open var myField1:String = ""
  open var myField2:String = ""
  open var myField3:String = ""
}

CRUDコードを記述

最初にrealmオブジェクトを呼び出し、それを使ってCRUDを実行する流れ Realmはシングルトンなのでクラス.メソッドで実行することができる。

create

//Realmインスタンスの取得
realm = Realm.getDefaultInstance()

realm.beginTransaction()
//realmインスタンスを使ってmodelの呼び出し
//create
val MyModel = realm.createObject(MyModel::class.java)
MyModel.myField1 = "フィールド1"
MyModel.myField2 = "フィールド2"

realm.commitTransaction()
//Realmインスタンスを開放する
realm.close()

主キーがある場合のcreate

create時に第二引数として主キーの値を渡さなければならない。

http://challenge.no1s.biz/programming/221

//Realmインスタンスの取得
realm = Realm.getDefaultInstance()

realm.beginTransaction()
//realmインスタンスを使ってmodelの呼び出し
//create
val MyModel = realm.createObject(MyModel::class.java, "hoge)
MyModel.myField1 = "フィールド1"
MyModel.myField2 = "フィールド2"

realm.commitTransaction()
//Realmインスタンスを開放する
realm.close()

read

//Realmインスタンスの取得
val realm = Realm.getDefaultInstance()

//read

val results:RealmResults<MyModel> = realm.where(MyModel::class.java).findAll().sort(MyModel.myField1.name)

//Realmインスタンスを開放する
realm.close()

ちなみにクエリの中身を参照するにはfor構文を用いたり、リストのインデックス参照するような感じで中身を表示させることができる。

println(results[2].myField1)
distinctを使った場合
val results:RealmResults<MyModel> = realm.where(MyModel::class.java).distinct(MyModel::myField1.name).findAll().sort(MyModel.myField1.name)

注意点としては、findAll()メソッド後にdistinct()メソッドをつなぐとエラーが出るので、distinct().findAll()とつなげるようにする。

delete

//Realmインスタンスの取得
val realm = Realm.getDefaultInstance()

realm.beginTransaction()
val results = realm.where(MyModel::class.java).findAll()
val data = results[3]

//delete
data.deleteFromRealm()
realm.commitTransaction()

//Realmインスタンスを開放する
realm.close()

主キーの設定

https://academy.realm.io/posts/realm-primary-keys-tutorial/

RealmによるDBの主キーの設定は以下のように主キーに設定したいフィールドの上で@Primarykeyを記述すれば主キーに変更することができる。 

open class MyModel:RealmObject(){
  @PrimaryKey
  open var myField1:String = ""
  open var myField2:String = ""
  open var myField3:String = ""
}

GitHub - chiaki1990/RealmSample_Kotlin