将数据写入Realm时,如何仅更新NOT NULL值

大家好! 我的情况是,我有一个饲料的屏幕,每个饲料的细节都存储在一个领域。 每个这些项目都有offset和feedPostedAt属性定义。 当用户点击某个项目并下载项目的详细信息以提供当前数据时,就会出现问题。 然而,下载的细节不包含属性偏移量和feedPostedAt因此,当我更新领域( realm.copyOrUpdate() )这个项目与定义的偏移量和feedPostedAt属性的旧项目将被覆盖。

有没有一种方法,领域只更新定义的值,并保留具有空值的属性不变?

现在我正在处理这个问题,我手动重置偏移量和feedPostedAt属性,但它不好也不有效。

  • 在Realm Android中使用List <String>的最佳方式是什么?
  • Android中stringtypes的RealmList
  • 在Realm中使用预先填充的数据库
  • 领域exception“值”不是有效的pipe理对象
  • 让GSON&Realm玩起来不错
  • 预先填充数据的领域变成资产?
  • Realm.io - 如何更新对象?
  • 一起使用JavaCV和Realm会导致“java.lang.UnsatisfiedLinkError”
  • 可能会晚一点,但这是我使用的。 该方法使用更新对象的非默认值属性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(); } } } 
    • 它使用reflection来访问所有属性。
    • 两个对象都必须从领域分离。
    • 对象模型应该具有@PrimaryKey注释属性,以便Realm#insertOrUpdate完成其工作。 否则,方法需要一些调整。