2015-09-08 3 views
8

Helo a tutti! Il mio scenario è che ho una schermata con un feed e ogni elemento di feed con i suoi dettagli è memorizzato in un regno. Ognuno di questi elementi ha proprietà offset e feedPostedAt definite. Il problema si presenta quando un utente fa clic su un elemento e il dettaglio dell'articolo viene scaricato per fornire i dati correnti. Tuttavia, i dettagli scaricati non contengono proprietà offset e feedPostedAt pertanto quando aggiorno il dominio (realm.copyOrUpdate()) questo elemento il vecchio elemento con le proprietà offset definite e feedPostedAt verrà sovrascritto.Come aggiornare solo i valori NOT NULL quando si scrivono dati su Realm

C'è un modo in cui l'ambito aggiorna solo i valori definiti e lascia inalterate le proprietà con valori NULL?

In questo momento ho a che fare con questo problema in modo da reimpostare manualmente la proprietà offset e feedPostedAt ma non è né piacevole né efficace.

+2

Non credo che sia possibile, a meno che non la mappatura da soli manualmente (https://github.com/realm/realm-java/issues/1344) – EpicPandaForce

+0

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. –

+0

@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(). –

risposta

1

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.