realm 3.2.0アップグレード時の備忘メモ(sharing schemas)
動作環境
結論的なこと
sharing schemas宣言 でつくられたクラスはメジャーバージョン間では互換性がない=>エラーで落ちる
- NGだったケース
root realm 3.2.0 mainP realm 3.2.0 LibP LibP.aar realm 3.1.0
- OKだったケース
root realm 3.1.4 mainP realm 3.1.4 LibP LibP.aar realm 3.1.0
状況
スタックトレース送ってもらうことできますか?
— zaki50 (@zaki50) 2017年5月16日
@zaki50スタックエラー的にはrealm.close()がヌルポなのですが原因的には Realm.getDefaultInstance()でnullが返ってくる事が原因のようです(ステップデバックするとあとはsharing schemas&呼出関数の所在かaar側
@zaki50 自己解決しました。LibP.aar側でsharing schemas宣言時の静的生成クラスがメジャーバーション時に互換性なくてこけるようで、aar側で変更してaar再作成で解決。exclude realm.io で本体側で再参照だけでは駄目なんですね(汗
あー、annotation processorで生成されたクラスについてはバージョン間の互換性を保証してないので、単一アプリ内でビルド時に使うRealm Javaのバージョンは何らかの方法で揃えてもらう必要がありますね。
— zaki50 (@zaki50) 2017年5月17日
RealmObjectServer 関連の不明な挙動
の RealmのRemoteDebug 利用時
- sharing schemas利用クラス を SyncConfiguration.Builderで同期した時
事象的には、以前zakiさんに相談したクラスが見つからないエラーが出てる*3
Realm RealmObject is not part of the schema for this Realm
sharing schemas自体あんまり使われていないのかな? うーん><
Realm.writeCopyTo の話
を参照
SyncConfiguration.BuilderのURL指定
単一名ならOKな感じでした。パッケージ名はSync時にエラーになる感じ
public class DebugHogeApplication extends HogeApplication { private final static String TAG = DebugHogeApplication.class.getSimpleName(); @Override public void onCreate() { super.onCreate(); } //◎HogeApplicationのinitConfigを上書き @Override protected void initConfig(){ Realm.init(this); SyncCredentials credentials = SyncCredentials.usernamePassword( "hoge@fuga.jp", "hogehoge", false); //△本当に適当なアカウントでOK SyncUser.loginAsync(credentials, "http://localhost:9080/auth", new SyncUser.Callback() { @Override public void onSuccess(SyncUser user) { //String url = "realm://localhost:9080/~/" + BuildConfig.APPLICATION_ID; //==NG== String url = "realm://localhost:9080/~/" + TAG; //==OK== //String url = "realm://localhost:9080/~/debug"; //==OK== //url = url.toLowerCase(); Log.d(TAG, "initConfig :onSuccess=>" + url); RealmConfiguration config = new SyncConfiguration.Builder(user, url).build(); Realm.setDefaultConfiguration(config); } @Override public void onError(ObjectServerError error) { //★ここに通常接続時の記述を書いておくとベター Realm.init(this); RealmConfiguration config = new RealmConfiguration.Builder().build(); Realm.setDefaultConfiguration(config); } }); } }
APTバージョン不一致による不具合
Realmの最新版(AS2.3でコンパイル) をAS2.2.3環境に導入するとdata-bindingとかがビルドがエラーになる現象。
原因はAPTの内部のバージョンが違う不一致みたい。まあ其のためにG様がapt plugin禁止にしてるわけだしな・・(汗
aptと同じ扱いですね。
— close_yutori (@kimukou2628) 2017年5月18日
ただこれ
AS2.3でbuildされたrealm最新版を
AS2.2.3でコンパイルするとbuildエラーになるように、ktバージョンの不一致でエラーになるとか今後有りそう~
Retropiler
因みにAPTを使っている Retropiler もぶつかってしまいコンパイルできず・・・。*4
下記試す場合は data-bindingも使えないのかな・・(遠い目 *5
InstantRun は Retrolambda使ってるとエラーになるしな・・*6。まあ其のためのG様標準サポートでは有ると思うんですけどね