2015-09-08 5 views
8

Helo everyone! Mój scenariusz jest taki, że mam ekran z kanałem, a każdy element kanału z jego szczegółami jest przechowywany w krainie. Każdy z tych elementów ma zdefiniowane właściwości offset i feedPostedAt. Problem pojawia się, gdy użytkownik klika element, a szczegóły przedmiotu są pobierane w celu dostarczenia aktualnych danych. Jednak pobrane szczegóły nie zawierają właściwości offset i feedPostedAt, więc gdy aktualizuję w dziedzinie (realm.copyOrUpdate()) ten element zostanie zastąpiony starym elementem ze zdefiniowanymi właściwościami offset i feedPostedAt.Jak aktualizować tylko wartości NOT NULL podczas zapisywania danych do dziedziny

Czy istnieje sposób, że dziedzina aktualizuje tylko te wartości, które zostały zdefiniowane i pozostawia właściwości z wartościami NULL nietkniętymi?

W tej chwili mam do czynienia z tym problemem w sposób, który ręcznie wyzerować offset i właściwość feedPostedAt, ale nie jest ładny ani skuteczny.

+2

Nie sądzę, że jest to możliwe, chyba że ręcznie wykonasz mapowanie (https://github.com/realm/realm-java/issues/1344) – EpicPandaForce

+0

Używaj biblioteki Gson do analizowania danych. Będzie analizować i aktualizować nowe dane, które zawiera twoja odpowiedź API. Pozostałe pola pozostaną bez zmian. –

+0

@NooruddinLakhani Już parsuję odpowiedź API za pomocą biblioteki Gson, następnie ręcznie odwzorowuję odpowiedź na nowo utworzony RealmObject, a następnie używam metody copyOrUpdate. Spróbuję stworzyćOrUpdateObjectFromJson(). –

Odpowiedz

1

Może być trochę za późno, ale to jest to, czego używam. Metoda aktualizuje obiekt base o niedomyślnych właściwościach wyceny obiektu update. Następnie stosuje się metodę Realm#insertOrUpdate do aktualizacji bazy danych dziedzin.

/** 
* 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(); 
     } 
    } 
} 
  • Wykorzystuje odbicie na dostęp do wszystkich właściwości.
  • Oba obiekty muszą być odłączone od dziedziny.
  • Model obiektowy powinien mieć przypisaną właściwość @PrimaryKey, aby wykonać swoje zadanie pod numer Realm#insertOrUpdate. W przeciwnym razie metoda wymaga nieco strojenia.
Powiązane problemy