Realmの使い方について
メモ
参考:
https://realm.io/docs/java/6.0.2/
[Android] SQLiteをやめてRealmを使ってみた
イメージ
ORM?みたいに扱うイメージ。 djangoのModelを定義するように、RealmObjectを継承したクラスを定義し、メソッドでUpdateしたり参照したりする感じ。
実装手順は以下の通り。
インストール
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 = "" }