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.

  • ¿Cómo dibujo una flecha (en Android)?
  • ListView con disposición de filas personalizada - Android
  • Obtenga coordenadas GPS: Android
  • Uso de lambdaj en android
  • Android - ¿Cómo se especifica una ubicación al llamar al calendario con una intención?
  • Adición de carpetas de java al proyecto de estudio de Android
  • 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!

  • ¿Cuándo se llama a View.onMeasure ()?
  • Espere a que se complete el AsyncTask múltiple
  • Establecer el color de fondo: Android
  • Hacer un temporizador de intervalo en Java android
  • Android Google Maps No se pudo encontrar el estilo 'mapViewStyle' en el tema actual
  • ¿Cómo obtener todos los nombres de tablas en la base de datos Android sqlite?
  • 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.