大家好! 我的情况是我有一个带有Feed的屏幕,每个带有详细信息的Feed项目都存储在一个领域中。这些项目中的每一项都定义了offset和feedPostedAt属性。当用户点击某个项目并下载项目的详细信息以提供当前数据时,就会出现问题。但是,下载的详细信息不包含属性offset和feedPostedAt,因此当我在领域( realm.copyOrUpdate())中更新此项时,将覆盖具有已定义偏移量和feedPostedAt属性的旧项目。
有没有一种方法可以只更新已定义的值并保留未更改NULL值的属性?
现在我正在以一种手动重置offset和feedPostedAt属性的方式处理这个问题,但它不好也没有效。
答案 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
完成其工作。否则,方法需要进行一些调整。