やっぱり駄目だったよ realm-gradle-plugin 2.2.1(=>解決しました)

はじめに

この記事は

Android その3 Advent Calendar 2016 - Qiita

の二日目の記事です。


昨日までの話は

annotationProcessor 対応の realm-gradle-plugin 2.2.1

が本日リリースされたので再トライ

試した環境は

先に結論

一応 Gradle Sync までは通りました・・

だがしかし・・・

ビルドまでは通りません・・ 下記のエラーが出てビルドが止まってしまう・・

so が duplicate entry

まだ待ちでしょうかね・・・*1

12/2追記

zaki さんに RealmのSlackで言及して頂き、解決まで色々とサポートしていただきました。

大変ありがとうございました。フィードバック記事も下記に書きました。

exception-think.hatenablog.com

変更した記述

  • root/build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.+'
        classpath 'io.realm:realm-gradle-plugin:2.2.1'
    }
}
  • app/build.gradle
apply plugin: 'com.android.application'
// androidの後である必要がある
apply plugin: 'realm-android'

とりあえずversionアップ的にエラーが出ないように記述を変えた箇所

  • app/build.gradle [1]
dependencies {
  compile 'io.realm:realm-android:0.87.5'
}

=>

  • root/build.gradle [2]
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.+'
        classpath 'io.realm:realm-gradle-plugin:2.2.0'
    }
}

[1] => [2] に変更する当たって修正する箇所

みて作業していました

[2]の段階でなくなった関数があり。。

とりあえず[1]で動かせる状態で[2]でコンパイルが通るコードに変更してみます

java-doc を見てる限り、関数存在してそうなんですけどね。。(汗

あと動作テストしていて、Exceptionが拾えずにアプリが強制終了な件は

開発する上ですごく厳しいなと思いました。。

Realm.instanceの取得方法

  • Realm.getDefaultInstance()
  • Realm.setDefaultConfiguration()

が undefinedになりました

=> Realm.getInstance(RealmConfiguration configuration)

の利用に修正

データ操作関数(例:削除)

  • realm.XXXX みたいな操作関数がなくなった
    • => RealmResults<◎◎> を一旦取得してから操作
    • RealmResults に対してデータ操作関数を呼び出す
RealmResults<User> result = realm.where(User.class).findAll();
result.clear()

前回悩んでいたことの対処調査

通常DTO<=>Realm操作用DTO変換関数を実装するのがシンドイ

  • RealmObject を extendsしたクラスに制限ありすぎ。。
    • Getter/Setterを延々と書かないと駄目。。
    • 通常操作用DTO <=>RealmObject継承互換DTO な変換関数を作って利用する?
      • => 変換関数の中でひたすらメンバ格納の処理書くのはツララタンw

=>

この対策に関して調べてみると

  1. 通常操作DTO=>Gson=>json に変更
  2. jsonをRealmObjectのメンバとして保存
  3. 復元は json=>Gson=>通常操作DTO

あたりの話が StackOverFlow とかででてきますね・・

勿論、SerializeできないオブジェクトメンバーはGsonでエラーになるので

@Expose()アノテーションで除外は必要かと

public class UserSimple {  
//もしくは  public class UserSimple implements Serializable 

    String name;
    String email;
    int age;

    @Expose(serialize = false, deserialize = false)
    Marker marker;
}
Field Serialise Deserialise
@Expose(deserialize = false) YES NO
@Expose YES YES
@Expose(serialize = false) NO YES
@Expose(serialize = false, deserialize = false) NO NO
final GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
final Gson gson = builder.create();

String json = gson.toJson(account);

Account account = gson.fromJson(json, Account.class);

変換関数の設置場所

  • ReaimObject内では基本
    • private フィールドのみ
    • getter/setter
    • DB出力対象外のフィールドは @Igrone 指定

辺りしかかけないことになっていますが、

static関数であればその制約*2が除外されるようです。

まあ普通はDB操作層って RealmUtils みたいなラッパークラスを作ると思うので

あんまり考えなくてもいいのかなーとか思いつつ

*1:AS 2.3.+ 依存かどうかまでは判定できていない。。

*2:ビルドlintチェック?