Каков наилучший способ использования List в Realm Android?

#android #realm

#Android #realm

Вопрос:

Я использую RealmString альтернативу List < String> в Realm Android. Но у меня проблема с RealmChangeListener. Я использую RealmString во многих моделях, таких как Dog, Cat, Chicken в примере ниже. Но когда кто-либо в этом изменяет данные, все они тоже меняются.

Пример: когда я сохраняю Dog -> Изменение Dog и Cat тоже меняются.

Я могу решить эту проблему, используя RealmDogString, RealmCatString, RealmChickenString, но это дублирует мой код. У кого-нибудь есть лучшее решение?

Это мой пример кода:

 public class RealmTestActivity extends AppCompatActivity {
    private Context context;
    private Realm realm;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_realm_test);

        Stetho.initialize(
            Stetho.newInitializerBuilder(this)
                .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
                .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build()).build());

        context = this;

        RealmConfiguration realmConfig = new RealmConfiguration.Builder(this).build();
        Realm.setDefaultConfiguration(realmConfig);
        realm = Realm.getDefaultInstance();

        final RealmResults<Dog> puppies = realm.where(Dog.class).lessThan("age", 2).findAll();
        puppies.addChangeListener(new RealmChangeListener<RealmResults<Dog>>() {
          @Override
          public void onChange(RealmResults<Dog> results) {
            System.out.println("XXX Dog ::"   puppies.size());
            Toast.makeText(context, "Dog Change", Toast.LENGTH_SHORT).show();
            puppies.size();
          }});


        final RealmResults<Cat> puppiesCat = realm.where(Cat.class).lessThan("age", 2).findAll();
        puppiesCat.addChangeListener(new RealmChangeListener<RealmResults<Cat>>() {
          @Override
          public void onChange(RealmResults<Cat> results) {
            System.out.println("XXX Cat  ::"   puppiesCat.size());
            Toast.makeText(context, "Cat Change", Toast.LENGTH_SHORT).show();
          }
        });
    }

    public void saveDog(View view) {
        Dog dog = new Dog();
        dog.setName("Bella");
        dog.setAge(1);
        RealmList<RealmString> realmStrings = new RealmList<RealmString>();
        RealmString realmString = new RealmString();
        realmString.setValue("link_Bella.png");
        realmStrings.add(realmString);
        dog.setImage(realmStrings);

        realm.beginTransaction();
        realm.copyToRealm(dog);
        realm.commitTransaction();
    }

    public void saveCat(View view) {
        Cat cat = new Cat();
        cat.setName("Oliver");
        cat.setAge(1);
        RealmList<RealmString> realmStrings_2 = new RealmList<RealmString>();
        RealmString realmString_2 = new RealmString();
        realmString_2.setValue("link_Oliver.png");
        realmStrings_2.add(realmString_2);
        cat.setImage(realmStrings_2);
        realm.beginTransaction();
        realm.copyToRealm(cat);
        realm.commitTransaction();
    }
}
  

Комментарии:

1. Не ответ, но мы будем признательны, если вы сможете добавить вышеуказанное в github.com/realm/realm-java/issues/575

2. Спасибо @geisshirt. Но я не могу опубликовать, потому что в GitHub говорится: «Этот разговор был заблокирован и ограничен сотрудниками».

3. Извините за неудобства. У меня есть полномочия разблокировать разговоры 🙂 Я добавил ссылку в проблему сюда.

4. Спасибо @geisshirt, ты можешь сделать это для меня 🙂

5. Вы должны хранить List<String> как одно строковое поле.

Ответ №1:

Realm для Android поддерживает список примитивов из версии 4.0.0: https://github.com/realm/realm-java/issues/575