Realmの基本的な使い方まとめ in Kotlin

#1.概要
RealmはSQLiteに代わる軽量、高速データベースでアプリ開発にも利用できます。
そのRealmが7.0.0になりKotlinの正式ドキュメントも公開されました！
せっかくなのでAndroidアプリでの簡単な使い方をまとめます。
7.0.0はbeta版で、安定板は6.0.２になります。お好みでどうぞ！

■URL
【公式】Kotlinドキュメント
https://realm.io/docs/kotlin/latest/
【公式】Javaドキュメント
https://realm.io/docs/java/latest/
自作サンプル（INSERT,SELECT,DELETEしているだけ）
https://github.com/KIRIN3git/RealmTest

#2.事前準備
build.gradleは7.0.0と6.0.2で設定が違います。

```build.gradle【7.0.0】
buildscript {
    repositories {
        jcenter()
        google()
        maven {
            url 'http://oss.jfrog.org/artifactory/oss-snapshot-local'
        }
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:7.0.0-beta-SNAPSHOT"
    }
}

allprojects {
    repositories {
        jcenter()
        google()
        maven {
            url 'http://oss.jfrog.org/artifactory/oss-snapshot-local'
        }
    }
}
```

```build.gradle【6.0.2】
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:6.0.2"
    }
}
```

```[app]build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'realm-android'
```

<font color="red">（注意）kotlinプラグインの後にrealm-androidでないとダメ</font>


#3. 初期化と設定
初期化と設定を行います。
初期化の場所はどこでもOKですが、最初に呼び出せば良いのでApplicationクラスがオススメだそうです。

設定はDBを分けたり、拡張したり、永続化せずインメモリにしたり、リードオンリーにしたりするのに利用するそうです。
設定しなくても動きます。
・参考
[RealmConfiguration](https://realm.io/docs/java/latest/api/io/realm/RealmConfiguration.html)

 ```MainApplication.kt
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        // 初期化
        Realm.init(this)

        // 設定
        val config = RealmConfiguration.Builder()
            .name("myrealm.realm")
            .encryptionKey(getMyKey())
            .schemaVersion(42)
            .modules(MySchemaModule())
            .migration(MyMigration())
            .readOnly()
            .inMemory()
            .build()
        Realm.setDefaultConfiguration(config)
    }
}
```

#４. モデルクラスの作り方
データをinsertしたりselectするためのデータの型を作成

- 手順
    -  RealmObjectを継承<font color="red">（必須）</font>
    -  openに設定<font color="red">（必須）</font>
    -  必要に応じてアノテーションを設定
        - @PrimaryKey プライマリーキー
        - @Index インデックス
        - @Ignore 保存したくない項目
        - @Required 必須項目

プライマリーキー​を設定するとcopyToRealmOrUpdateまたはinsertOrUpdateを使用できます。

```Person.kt
open class Person(
    @PrimaryKey var id: Long = 0,
    var name: String = "",
    var age: Int = 0
) : RealmObject()
```

#5. 登録方法(INSERT)

- 手順
    -  インスタンスを作成
    -  トランザクションでラップ
    -  insert
    -  インスタンスを閉じる

インスタンスはアクティビティ内などで使いまわしても良いです。
そしてインスタンスは必ず閉じましょう！
トランザクションの方法は色々あります。
非同期で使いたい場合は[executeTransactionAsync](https://realm.io/docs/kotlin/latest/#asynchronous-transactions)

```RealmSql.kt
// インスタンス作成
var realm = Realm.getDefaultInstance()

val personData = Person(1,”Taro”,15)

realm.beginTransaction()
realm.insert(personData)
realm.commitTransaction()

// インスタンスを閉じる
realm.close()
```

#6. 取得方法(SELECT)

- 手順
    - インスタンスを作成
    - データの取得
    - 絞り込み
    - メモリ外にコピー
    - インスタンスを閉じる

- 主な取得関数
    - findAll：クエリ条件を満たすすべてのオブジェクトを検索します
    - findAllAsync：バックグラウンドスレッドで非同期に動作します
    - findFirst（またはfindFirstAsync）：クエリ条件を満たす最初のオブジェクトを見つける

その他関数はこちら(Javaだけど・・・)
https://realm.io/docs/java/3.5.0/api/io/realm/RealmQuery.html

利用方法はこちらを参照
https://realm.io/docs/kotlin/latest/#queries

RxJavaも利用できる！（試してはいない・・・）
https://realm.io/docs/kotlin/latest/#rxjava

<font color="red">（注意） realmオブジェクトはRealmインスタンスをクローズすると消えてしまう。kotlinオブジェクトとして使いたい場合はcopyFromRealmを使用！</font>

```RealmSql.kt
// インスタンス作成
var realm = Realm.getDefaultInstance()

// 全取得
val users = realm.where<Person>().findAll()
// 絞り込み
users.equalTo("name", "John”)
// メモリ外にコピー
val user = realm.copyFromRealm(users[0])

// インスタンスを閉じる
realm.close()
```

#7. 削除方法(DELETE)

- 手順
    -  インスタンスを作成
    -  トランザクションでラップ
    -  delete
    -  インスタンスを閉じる

```RealmSql.kt
// インスタンス作成
var realm = Realm.getDefaultInstance()

realm.beginTransaction()
// 削除
persons.deleteAllFromRealm()
realm.commitTransaction()

// インスタンスを閉じる
realm.close()