如何在向Realm写入数据时仅更新NOT NULL值

时间:2015-09-08 10:54:25

标签: android realm

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

有没有一种方法可以只更新已定义的值并保留未更改NULL值的属性?

现在我正在以一种手动重置offset和feedPostedAt属性的方式处理这个问题,但它不好也没有效。

1 个答案:

答案 0 :(得分:1)

可能有点晚了,但这就是我使用的。该方法使用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完成其工作。否则,方法需要进行一些调整。