Как обновлять значения NOT NULL при записи данных в Realm

Привет всем! Мой сценарий заключается в том, что у меня есть экран с фидом, и каждый элемент фида с его деталями хранится в царстве. Каждый из этих элементов имеет свойства offset и feedPostedAt. Проблема возникает, когда пользователь нажимает на элемент и деталь детали загружается для предоставления текущих данных. Однако загруженная деталь не содержит смещения свойств и feedPostedAt, поэтому, когда я обновляю в области ( realm.copyOrUpdate () ), этот элемент будет перезаписан старый элемент с определенными свойствами offset и feedPostedAt.

Есть ли способ, которым область обновляет только значения, которые определены и оставляет свойства с значениями NULL нетронутыми?

Прямо сейчас я имею дело с этой проблемой так, что я вручную сбросил смещение и свойство feedPostedAt, но это не приятно и неэффективно.

Это может быть немного поздно, но это то, что я использую. Метод обновляет base объект с нецензурными свойствами объекта update . Затем Realm#insertOrUpdate метод используется для обновления базы данных.

  /** * Both classes must be detached from realm. * Primitives compared with their defaults. * check <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5"/>default values of primitives</> */ public static <T> void updateObject(T base, T update) { Class<?> aClass = base.getClass(); for (Field field : aClass.getDeclaredFields()) { try { field.setAccessible(true); Class<?> fieldType = field.getType(); if (fieldType.isPrimitive()) { if (fieldType.equals(boolean.class)) { if (field.getBoolean(update)) { field.setBoolean(base, true); } } else if (fieldType.equals(int.class)) { if (field.getInt(update) != 0) { field.setInt(base, field.getInt(update)); } } else if (fieldType.equals(long.class)) { if (field.getLong(update) != 0L) { field.setLong(base, field.getLong(update)); } } else if (fieldType.equals(short.class)) { if (field.getShort(update) != (short) 0) { field.setShort(base, field.getShort(update)); } } else if (fieldType.equals(byte.class)) { if (field.getByte(update) != (byte) 0) { field.setByte(base, field.getByte(update)); } } else if (fieldType.equals(float.class)) { if (field.getFloat(update) != 0.0f) { field.setFloat(base, field.getFloat(update)); } } else if (fieldType.equals(double.class)) { if (field.getDouble(update) != 0.0d) { field.setDouble(base, field.getDouble(update)); } } else if (fieldType.equals(char.class)) { if (field.getChar(update) != '\u0000') { field.setChar(base, field.getChar(update)); } } } else { Object newValue = field.get(update); if (newValue != null) { field.set(base, newValue); } } } catch (IllegalAccessException e) { e.printStackTrace(); } } } 
  • Он использует отражение для доступа ко всем свойствам.
  • Оба объекта должны быть отделены от области.
  • Объектная модель должна иметь @PrimaryKey аннотированное свойство, чтобы Realm#insertOrUpdate выполнял свою работу. В противном случае метод требует некоторой настройки.