Архитектура и область Android MVP — как избежать передачи контекста между слоями MVP?

Я некоторое время изучал Android MVP, в большинстве своих приложений я обнаружил, что не так практично передавать контекстные данные между уровнями MVP для целей тестирования.

Однако в некоторых случаях это необходимо сделать, например, чтобы получить доступ к базе данных Realm, мне понадобятся Контекстные данные для выполнения этой реализации:

Реализация области

 Realm.init(mainContext)

        val config = RealmConfiguration.Builder()
                .name(mainContext.getString(R.string.accountRealm))
                .build()

        realm = Realm.getInstance(config)

Только то, что я могу выполнять CRUD-функциональность Realm.

Из-за этого мне всегда приходится передавать контекстные данные со слоя представления на слой модели, что, как мне кажется, не так практично.

Мой вопрос:

  1. Есть ли другой способ реализовать функциональность Realm без использования контекстных данных? Как мне сделать это правильно?

  2. Можно ли продолжать передавать контекстные данные или другой аналогичный специфичный для Android код на уровне MVP? Как и в случае с Realm, считается ли это «приемлемым компромиссом»?


person I am a Student    schedule 16.07.2018    source источник
comment
Есть ли причина, по которой имя файла Realm - String resource, а не, например, "wallet.realm"?   -  person EpicPandaForce    schedule 16.07.2018
comment
@epicpandaforce Я указал его как строковый ресурс, поэтому, когда необходимо изменить имя, мне просто нужно отредактировать файл String.xml вместо того, чтобы вручную изменять все функции, которые имеют одинаковую реализацию.   -  person I am a Student    schedule 17.07.2018
comment
Вероятно, вам следует просто сделать для этого константу Public static final в своем коде, и вы внезапно удалили свою зависимость от Context.   -  person EpicPandaForce    schedule 17.07.2018
comment
@epicpandaforce Извините, что вы имеете в виду под удалением вашей зависимости от контекста?   -  person I am a Student    schedule 18.07.2018


Ответы (1)


В фрагменте кода есть два недостатка (если можно так назвать).

Во-первых. Realm.init(mainContext) должно быть выполнено в onCreate() приложения, только один раз.

public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    Realm.init(this);
  }
}

Затем добавьте MyApplication в файл manifest.xml, как показано ниже.

<application
  android:name=".MyApplication"
  <!--rest of properties-->
/>

Во-вторых. Обычно рекомендуется читать статические строки из ресурсов, но не во всех случаях. Этот случай, например, является исключением.

Создайте класс java для хранения имени вашей базы данных, как показано ниже:

public class AppStatics{
    public final static REALM_DATABASE_NAME = "myrealm.realm";
}

Затем просто возьмите имя базы данных из этого класса, чтобы задать имя для базы данных Realm. . Вам не нужно каждый раз настраивать Realm.

public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    Realm.init(this);
    RealmConfiguration.Builder()
            .name(mainContext.getString(R.string.accountRealm))
            .build()
    Realm.setDefaultConfiguration(config);
  }
}

Теперь вы можете вызвать экземпляр Realm, вызвав Realm realm = Realm.getDefaultInstance(); в своей модели (модуль операций с данными MVP).

person Farid    schedule 28.08.2019