Realm(Java)データベース使用ドキュメント(サードパーティクラスライブラリ)


文書ディレクトリ
  • 14.1 GSON
  • 14.2シーケンス化Serialization
  • 14.3オリジナルリストPrimitive lists
  • 14.4トラブルシューティングTroubleshoting
  • 14.5 Jacksonデータバインド
  • 14.6 Kotlin
  • 14.7 Parceler
  • 14.8 Retrofit
  • 14.9 Robolectric
  • 14.10 RxJava

  • Realm(Java)データベース使用ドキュメント(ディレクトリ)
    このセクションでは、Realmを他の一般的なAndroidライブラリと統合する方法について説明します.
    14.1 GSON
    GSONはGoogleが作成した逆シーケンス化とシーケンス化JSON用のライブラリです.GSONはRealmと開梱してすぐ使うべきです.
    // Using the User class
    public class User extends RealmObject {
        private String name;
        private String email;
        // getters and setters left out ...
    }
    
    Gson gson = new GsonBuilder().create();
    String json = "{ name : 'John', email : '[email protected]' }";
    User user = gson.fromJson(json, User.class);
    

    また、GridView Exampleでは、GSONがRealmとどのように動作するかの例も参照できます.
    14.2シリアル化Serialization
    Retrofitなどのライブラリと完全に互換性を保つには、通常、オブジェクトを逆シーケンス化してシーケンス化する必要があります.RealmオブジェクトをJSONにシーケンス化するのは、GSONがgetterやsetterではなくフィールド値を使用するため、GSONのデフォルトの動作には適用されません.
    GSONシーケンス化をRealmとともに使用するには、シーケンス化可能なオブジェクトごとにカスタムJsonSerializer(接続が無効)を作成し、TypeAdapter(接続が無効)として登録する必要があります.
    このポイントでは、実装方法について説明します.
    14.3オリジナルリストPrimitive lists
    Realmは、JSONの配列をネイティブ・リストにインポートすることをローカルでサポートしていますが、ネイティブ・リストのクエリー・サポートが不足しているのは問題の可能性があります.基本タイプのJSON配列をRealmObjectのリストとしてインポートする場合があります.JSON APIを変更できない場合は、GSONのカスタムTypeAdapter(接続が無効になっている)を作成できます.このアダプタは、JSONの元のタイプとRealmで使用されているパッケージオブジェクトとの間で自動的にマッピングされます.
    このポイントでは、Integer用にパッケージオブジェクトを使用する例ですが、このテンプレートはRealmでサポートされているデータ型を持つすべての基本配列に使用できます.
    14.4トラブルシューティング
    Realmオブジェクトには、内部に循環参照を含むフィールドを含めることができます.このような場合、GSONはStackOverflowErrorを放出する可能性があります.RealmオブジェクトにDrawableフィールドがある場合、次のことが起こります.
    public class Person extends RealmObject {
        @Ignore
        Drawable avatar;
        // other fields, etc
    }
    

    上記のPersonクラスには@Ignoreコメントを適用したAndroid Drawableが含まれています.GSONシーケンス化の間、Drawableをチェックしていて、StackOverflowError(GitHubの問題)を引き起こしています.このような状況を軽減するために、shouldSkipFieldメソッドに以下のコードを追加してください.
    public boolean shouldSkipField(FieldAttributes f) {
      return f.getDeclaringClass().equals(RealmObject.class) || f.getDeclaringClass().equals(Drawable.class);
    }
    

    Drawable.class評価に注意してください.これは、GSONがシーケンス化中にこのフィールドをスキップしたことを示す.このオプションを追加すると、StackOverflowErrorが緩和されます.
    14.5 Jacksonデータバインド
    Jackson Databindは、JSONデータをJavaクラスにバインドするためのライブラリです.
    Jacksonは、反射を使用してデータバインドを実行します.これは、クラスローダで使用できない可能性があるため、RealmのRxJavaのサポートと競合します.これにより、次のような異常が発生する可能性があります.
    java.lang.NoClassDefFoundError: rx.Observable
    at libcore.reflect.InternalNames.getClass(InternalNames.java:55)
    ...
    

    この問題は、RxJavaをプロジェクトに追加するか、以下のような2つの空虚なファイルを作成することで解決できます.
    // File 1
    package io.reactivex;
    
    public class Flowable {
    }
    
    
    // File 2
    package io.reactivex;
    
    public class Observable {
    }
    
    // File 3
    package io.reactivex;
    
    enum BackpressureStrategy {
        LATEST;
    }
    

    この問題は、ここのJacksonプロジェクトにも報告されています.
    14.6 Kotlin
    RealmはKotlinプログラミング言語と完全に互換性がある.Kotlinガイドを参照してください.
    14.7 Parceler
    Parcelerは、オブジェクトをParcelableインタフェースに準拠させるために必要なテンプレートを自動的に生成するライブラリです.Realmはプロキシクラスを使用するため、ParcelerはRealmのモデルクラスと一緒に使用するには以下の設定が必要です.
    Realmのエージェントクラスは、モデルクラスの全限定名にRealmProxy接尾辞を付けるため、例えばio.realm.model.Personio_realm_model_PersonRealmProxy.classとなる
    //     RealmObject                    RealmProxy 。           。   ,             ,     。
    @Parcel(implementations = { some_package_PersonRealmProxy.class },
            value = Parcel.Serialization.BEAN,
            analyze = { Person.class })
    public class Person extends RealmObject {
        // ...
    }
    

    Gradleを使用してParcelerを取得する場合は、次の行に必ず保存してください(詳細は、ここを参照).
    compile "org.parceler:parceler-api:1.0.3"
    apt "org.parceler:parceler:1.0.3"
    

    Parcelerを使用する場合は、いくつかの重要な制限に注意してください.
  • モデルにRealmListが含まれている場合は、特殊なアダプタを登録する必要があります.
  • オブジェクトをパッケージングすると、Realmから分離され、データスナップショットを含む非管理オブジェクトのように動作します.オブジェクトへのさらなる変更はRealmには保持されません.

  • 14.8 Retrofit
    RetrofitはSquareが提供するライブラリで、REST APIを簡単にタイプ安全に使用できます.
    Realmは、Retrofit 1.*と2.*を同時に使用できますが、Retrofitは、自動的にオブジェクトをRealmに追加するのではなく、realm.copyToRealm()またはrealm.copyToRealmOrUpdate()メソッドを使用して手動で追加する必要があります.
    GitHubService service = restAdapter.create(GitHubService.class);
    List repos = service.listRepos("octocat");
    
    //     Retrofit   Realm     。
    realm.beginTransaction();
    List realmRepos = realm.copyToRealmOrUpdate(repos);
    realm.commitTransaction();
    

    14.9 Robolectric
    Robolectricは、電話やエミュレータではなくJVMでJUnitテストを直接実行できるライブラリです.現在、RobolectricsではRealmにバンドルされたライブラリはサポートされていません.これは、RobolectricテストRealmがまだ使用できないことを意味します.
    ここでは、次の機能リクエストに注目できます.https://github.com/robolectric/robolectric/issues/1389
    14.10 RxJava
    RxJavaは、Observerモードを拡張するNetflixのReactive Extensionsライブラリです.これにより,データの変化の組合せ可能なシーケンスが観察される.
    RealmはRxJava 2 FlowableとObservableに対して一流のサポートを持っている.
  • Realm
  • RealmResults
  • RealmList
  • RealmObject
  • DynamicRealm
  • DynamicRealmObject
  • RealmResults changesets
  • RealmList changesets
  • RealmObject changesets
  • DynamicRealmObject changesets
  • //  Realm、Retrofit RxJava(     ,  Retrolambda  )
    //           GitHub         (     )
    Realm realm = Realm.getDefaultInstance();
    GitHubService api = retrofit.create(GitHubService.class);
    realm.where(Person.class).isNotNull("username").findAllAsync().asFlowable()
        .filter(persons.isLoaded)
        .flatMap(persons -> Observable.from(persons))
        .flatMap(person -> api.user(person.getGithubUserName())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(user -> showUser(user));
    

    非同期クエリは非ブロックです.上のコードはすぐにRealmResultsインスタンスを返します.ロードされたリストのみを操作する場合は、Flowableをフィルタ演算子でフィルタし、[RealmResults.isLoaded](api/io/realm/RealmResults.html#isLoaded-)メソッドを呼び出してリストを確認します.「RealmResults」がロードされているかどうかを確認して、クエリーが完了しているかどうかを確認します.
    Realm 7.0の新機能:すべてのRealm ObservableとFlowablesは、フリーズされたオブジェクトを返します.これは、これらのオブジェクトが可変ではないことを意味しますが、IllegalStateException:エラースレッドからのrealmアクセスを心配することなく、任意のスレッドまたはスケジューラから読み取りおよびクエリーできます.
    詳細については、RxJavaサンプルプロジェクトを参照してください.
    RxJavaはオプションの依存項目であり、Realmが自動的に含まないことを意味します.このような利点は、どのバージョンのRxJavaを使用するかを選択し、RxJavaを使用しないプロジェクトでメソッドのカウントが大きすぎることを避けることです.RxJavaをbuild.gradleファイルに手動で追加する必要があります.
    dependencies {
      compile 'io.reactivex:rxjava:2.1.4'
    }
    

    カスタムRxObservableFactoryを作成することで、Realmがストリームを作成する方法を設定できます.RealmConfigurationを使用して構成します.
    RealmConfiguration config = new RealmConfiguration.Builder()
      .rxFactory(new MyRxFactory())
      .build()
    

    RxObservableFactoryが定義されていない場合、RealmのデフォルトはRealmObservableFactoryです.これは、Realmが提供するRxJava<=2.*をサポートするクラスです.Realmバージョン7.0.0から、アクティブまたはフリーズされたオブジェクトを返すように構成できます.既定値はフリーズオブジェクトです.
    //             
    RealmConfiguration config = new RealmConfiguration.Builder()
      .rxFactory(new RealmObservableFactory(false)) 
      .build()
    

    RxJava 1を使用している場合は、David Karnokのライブラリを使用して、RxJava 2とRxJava 1タイプを変換できます.