Có thể hơi trễ nhưng đây là những gì tôi sử dụng. Phương pháp này cập nhật đối tượng base
với các thuộc tính không có giá trị mặc định của đối tượng update
. Sau đó, phương pháp Realm#insertOrUpdate
được sử dụng để cập nhật cơ sở dữ liệu realm.
/**
* 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();
}
}
}
- Nó sử dụng phản ánh để truy cập tất cả tài sản.
- Cả hai đối tượng phải được tách ra khỏi lĩnh vực.
- Mô hình đối tượng phải có
@PrimaryKey
thuộc tính được chú thích theo thứ tự Realm#insertOrUpdate
để thực hiện công việc của mình. Nếu không, phương pháp yêu cầu một chút điều chỉnh.
Tôi không nghĩ rằng có thể, trừ khi bạn tự mình lập bản đồ (https://github.com/realm/realm-java/issues/1344) – EpicPandaForce
Sử dụng thư viện Gson để phân tích cú pháp dữ liệu. Nó sẽ phân tích cú pháp và cập nhật dữ liệu mới mà phản hồi api của bạn chứa. Các trường còn lại sẽ vẫn giữ nguyên. –
@NooruddinLakhani Tôi đã phân tích cú pháp phản hồi api bằng cách sử dụng thư viện Gson sau đó tôi tự ánh xạ phản hồi tới RealmObject vừa tạo và sau đó tôi sử dụng phương thức copyOrUpdate. Tôi sẽ thử createOrUpdateObjectFromJson(). –