Potrebbe essere un po 'tardi ma questo è quello che uso. Il metodo aggiorna l'oggetto base
con proprietà di valore non predefinito dell'oggetto update
. Quindi il metodo Realm#insertOrUpdate
viene utilizzato per aggiornare il database di 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();
}
}
}
- Esso utilizza riflessione per accedere a tutte le proprietà.
- Entrambi gli oggetti devono essere separati dal reame.
- Il modello oggetto deve avere la proprietà annotata
@PrimaryKey
nell'ordine Realm#insertOrUpdate
per eseguire il proprio lavoro. Altrimenti il metodo richiede un po 'di messa a punto.
Non credo che sia possibile, a meno che non la mappatura da soli manualmente (https://github.com/realm/realm-java/issues/1344) – EpicPandaForce
biblioteca Uso GSON per i dati di analisi. Analizzerà e aggiornerà i nuovi dati contenuti nella risposta api. I campi rimanenti rimarranno così come sono. –
@NooruddinLakhani Sto già analizzando la risposta api utilizzando la libreria Gson, quindi associo manualmente la risposta a RealmObject appena creato e poi utilizzo il metodo copyOrUpdate. Proverò a creareOrUpdateObjectFromJson(). –