読者です 読者をやめる 読者になる 読者になる

realm 3.2.0アップグレード時の備忘メモ(sharing schemas)

動作環境

  • macOS Sierra
  • 16G
  • HDDタイプのiMac
  • AS 2.3.2

結論的なこと

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

状況

RealmObjectServer 関連の不明な挙動

の RealmのRemoteDebug 利用時

  • sharing schemas利用クラス を SyncConfiguration.Builderで同期した時
    • RealmBrowserで接続して開けないみたい *1
    • Realm.writeCopyTo(File f) 等でバックアップしたrealmファイルは、RealmBrowserで開ける *2

事象的には、以前zakiさんに相談したクラスが見つからないエラーが出てる*3

Realm RealmObject is not part of the schema for this Realm

sharing schemas自体あんまり使われていないのかな? うーん><

Realm.writeCopyTo の話

blog.techium.jp

を参照

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禁止にしてるわけだしな・・(汗

Retropiler

因みにAPTを使っている Retropiler もぶつかってしまいコンパイルできず・・・。*4

下記試す場合は data-bindingも使えないのかな・・(遠い目 *5

InstantRun は Retrolambda使ってるとエラーになるしな・・*6。まあ其のためのG様標準サポートでは有ると思うんですけどね

*1:同期自体は可能だが、realmファイルが開けない。

*2:writeCopyToの関数は、バックアップというよりRealmファイル自体を作り直すみたいな話が確かあったので、それで開けるのかも?

*3:sharing schemas を使ったクラスが存在しなければ問題ない感じでした

*4:dependenciesのRetrolambdaと相性が悪いのかもしれませんが・・

*5:AS2.4p6以降では使えましたが・・そっち待ち?

*6:sliceAPkの相互参照の辻褄が合わなくなるみたい。class not foundとかでる