Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android Realm copyToRealmOrUpdate crea duplicados de objetos anidados

Tengo las siguientes clases:

public class Note extends RealmObject { @PrimaryKey private String id; private Template template; // other primitive fields, getters & setters } public class Template extends RealmObject { private String name; private String color; // other primitive fields, getters & setters } 

Consigo mis datos del backend vía Retrofit y Gson, así que tengo objetos java listos para usar en respuesta.

  • Establecer el ancho del botón en Android
  • No se puede resolver el método 'show (android.support.v4.app.FragmentManager, java.lang.String)
  • AVD no se está ejecutando
  • ¿Puede una clase extender dos clases?
  • Nuevo Runnable () pero no nuevo hilo?
  • No se puede ejecutar dex: se superó el límite superior de GC en Eclipse
  • Imaginemos que el backend me devuelve los mismos tres Notes cada vez que lo llamo. Cuando consigo la lista de objetos de la nota, hago lo siguiente:

     private void fetchNotesAndSave() { List<Notes> notes = getNotesViaRetrofit(); Realm realm = Realm.getInstance(mContext); realm.beginTransaction(); realm.copyToRealmOrUpdate(notes); realm.commitTransaction(); realm.close(); } 

    Después de eso llamo a estas líneas para comprobar el conteo de objetos almacenados:

     int notesCount = mRealm.where(Note.class).findAll().size(); int templatesCount = mRealm.where(Template.class).findAll().size(); 

    Por primera vez:

     notesCount == 3; templatesCount == 3; 

    Está bien. Pero, si vuelvo a llamar al servidor, obtengo las mismas notas (los mismos identificadores de primaryKey) y llamo a fetchNotesAndSave () de nuevo, obtendré estos resultados:

     notesCount == 3; templatesCount == 6; 

    Cada vez que llamo copyToRealmOrUpdate (), los objetos anidados, que están dentro de los objetos con primaryKey, están duplicados – no actualizados.

    ¿Hay alguna manera de cambiar este comportamiento? Por favor, hágamelo saber si necesita más información. ¡Gracias por adelantado!

  • ¿por qué mi método de comparación arrojar excepción - método de comparación viola su contrato general!
  • Cómo escapar% en String.Format?
  • No se puede realizar la comprobación de instancia contra el tipo parametrizado ArrayList <Foo>
  • ¿Cómo implementar la funcionalidad de la cámara con opciones adicionales (como Panorama)?
  • ¿Por qué no puede OSX detectar Android S Galaxy para la depuración USB?
  • Cómo analizar la fecha desde TimeZone GMT a IST TimeZone y Vice Versa en android
  • 2 Solutions collect form web for “Android Realm copyToRealmOrUpdate crea duplicados de objetos anidados”

    Es porque su clase Template no tiene ninguna clave primaria. En ese caso, estos objetos se insertan nuevamente, ya que no hay garantía de que los objetos de plantilla referenciados puedan actualizarse de forma segura, incluso si forman parte de otro objeto que tiene una clave primaria.

    Si agrega un @PrimaryKey a su clase de plantilla, debería funcionar como esperaba.

    Si no puede proporcionar un PK como se sugirió, es posible que desee utilizar el trabajo siguiente para evitar duplicados.

     for (Note note: notes) { realm.where(Note.class) .equalTo("id", note.getId()) .findFirst() .getTemplate() .deleteFromRealm(); } realm.copyToRealmOrUpdate(notes); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.