2016-08-29 3 views
0

Кажется, что RalmObject задает свои поля значениям по умолчанию, когда переходит к конструктору другого объекта RealmObject (см. Комментарии в коде ниже). Простое обходное решение не передает объект конструктору и назначает поля после создания объекта. Но я действительно не понимаю, как это возможно. Поэтому мой вопрос: может кто-нибудь объяснить, что происходит, пожалуйста? И в каких ситуациях я должен быть осведомлен о подобном поведении во время работы с Realm?Android realm. Передача объекта RealmObject в качестве параметра для конструктора. Поля нулевых значений

Вот простой пример кода, который воспроизводит проблему:

realm = Realm.getDefaultInstance(); 
realm.executeTransaction(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      Stock stock1 = new Stock(); 
      stock1.id = "stock1"; 
      managedStock = realm.copyToRealm(stock1); 
     } 
}); 
//output here: managedStock.id = stock1 
Log.d("myLogs", "managedStock.id = " + managedStock.id); 
Goods goods = new Goods(managedStock); 

И в конструктор объекта Товары передается managedStock имеет идентификатор == NULL, как это возможно?

public class Goods extends RealmObject { 
    @PrimaryKey 
    public String id; 
    public Stock stock; 

    public Goods() {} 

    public Goods(Stock s) { 
     //output here: s.id == null 
     Log.d("myLogs", "s.id == " + s.id); 
    } 
} 

и сток объект, на всякий случай

public class Stock extends RealmObject { 
    @PrimaryKey 
    public String id; 
    public String name; 
} 

Некоторые дополнительная информация: сфера 1.2.0, Android 5.0, устройство Samsung Galaxy S4

Заранее спасибо!

+0

Вы можете попробовать заменить «Log.d (« myLogs »,« s.id == »+ s.id);' с 'String id = s.id; Log.d ("myLogs", "s.id ==" + id); '? Если это все еще «null», то это ошибка в Realm-Transformer. – EpicPandaForce

+0

@EpicPandaForce Yeap, это все еще «null» –

+1

Я не человек Realm, но это действительно звучит как проблема трансформатора Realm. Если вы сделаете выбор в своих полях, нажмите правую кнопку мыши, скажите «Инкапсулировать поля» и выберите все и, следовательно, создайте геттеры и сеттеры для своих полей повсюду, это все еще «null»? (Лично я все еще использую getter/setter в своих RealmObjects, потому что он кажется более стабильным, чем полевое преобразование.) – EpicPandaForce

ответ

1

Это звучит как проблема трансформации в царство, поэтому я сделал вопрос на realm-java github issues.

В то же время, я рекомендую использовать геттеры/сеттеры вместо прямого доступа к полю.

+0

Как я уже говорил (https://github.com/realm/realm-java/issues/3361#issuecomment-243275072), проблема кажется ошибкой в ​​трансформаторе Realm. Я установил тег 'T: Bug'. – zaki50

+0

Он будет исправлен в Realm 2.0.0 – EpicPandaForce

+0

Я объединил исправление в ветви 'релизы'. Он будет отправлен в следующем выпуске исправления ('1.2.1'). – zaki50

Смежные вопросы