#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