やっぱり駄目だったよ realm-gradle-plugin 2.2.1(=>解決しました)
はじめに
この記事は
Android その3 Advent Calendar 2016 - Qiita
の二日目の記事です。
- 昨日は yamacraft - Qiita さんの 2017年に向けてせめてminSdkVersionを14以上にしたい人たちに送る「材料」の見つけ方 - Qiita のお話です
- 明日は numa08 - Qiita さんの なぜ我々はData Bindingを利用するのか、テストの観点から考えてみる - Qiita のお話です
昨日までの話は
annotationProcessor 対応の realm-gradle-plugin 2.2.1
が本日リリースされたので再トライ
試した環境は
- Android Studio 2.3 Canary 2
- android gradle plugin 2.3.+
- data-binding も併用
先に結論
一応 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したクラスに制限ありすぎ。。
=>
この対策に関して調べてみると
あたりの話が 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 みたいなラッパークラスを作ると思うので
あんまり考えなくてもいいのかなーとか思いつつ