Настройте Monarchy только в одном модуле в существующем проекте, который использует Realm уже в модуле приложения - PullRequest
0 голосов
/ 14 февраля 2020

Я использую шаблон MVP в настоящее время в проекте. Я инициализирую Realm в своем классе Application, как показано ниже в модуле приложения.

    Realm.init(this);
    RealmConfiguration realmConfig = new RealmConfiguration.Builder()
            .name("company.realm")
            .schemaVersion(32)
            .modules(new RealmAppModule())
            .migration(new Migration())
            .build();
    Realm.setDefaultConfiguration(realmConfig);

А затем используйте область в модуле приложения, как показано ниже:

public class RealmManager {

public static final String TAG = "RealmManager";
protected static RealmManager mInstance = null;
private final ThreadLocal<Realm> localRealm = new ThreadLocal<>();

protected RealmManager() {
}

public static RealmManager getInstance() {
    if (mInstance == null) {
        synchronized (RealmManager.class) {
            if (mInstance == null) {
                mInstance = new RealmManager();
            }
        }
    }
    return mInstance;
}

private Realm openLocalInstance() {
    Realm realm = localRealm.get();
    if (realm == null) {
        realm = Realm.getDefaultInstance();
    }
    if (localRealm.get() == null) {
        localRealm.set(realm);
    }
    return realm;
}

private void closeLocalInstance() {
    Realm realm = localRealm.get();
    /*if (realm == null) {
        throw new IllegalStateException(
                "Cannot close a Realm that is not open.");
    }*/
    if (realm != null) {
        realm.close();
    }

    if (Realm.getLocalInstanceCount(Realm.getDefaultConfiguration()) <= 0) {
        localRealm.set(null);
    }
}

public void deleteClockFromDB(ClockRLM clockRealm) {
    try {
        Realm mRealm = openLocalInstance();
        mRealm.executeTransaction(realm -> {
            RealmResults<ClockRLM> result = realm.where(ClockRLM.class)
                    .equalTo("timeStamp", clockRealm.getTimeStamp()).findAll();
            result.deleteAllFromRealm();
        });
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    } finally {
        closeLocalInstance();
    }
}

И затем используйте его как в любом месте модуля приложения.

RealmManager.getInstance().deleteClockFromDB(...)

Теперь мы мигрируем в MVVM с АРХИТЕКТУРОЙ МОДУЛЯРИЗАЦИИ, начиная только с одного модуля

MVVM поставляется с Viewmodel, репозиторием, сценариями использования вместе с LiveData. Так что для go с MVVM я думаю использовать https://github.com/Zhuinden/realm-monarchy только в новом модуле, который будет следовать за MVVM. Поэтому я сомневаюсь, как я должен инициализировать монархию и где? Должен ли я сделать это только в новом модуле? И в каком слое (то есть Viewmodel, репозиторий, сценарии использования) я должен начать операции монархии? И как я могу сообщить об изменениях базы данных из БД в представление с данными, перемещающимися по всем этим слоям с помощью LiveData?

...