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

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

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

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

Solutions Collecting From Web of "将数据写入Realm时,如何仅更新NOT NULL值"

可能会晚一点,但这是我使用的。 该方法使用更新对象的非默认值属性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完成其工作。 否则,方法需要一些调整。