2016-06-29 11 views
1

Ich bekomme eine Reihe von Benutzern von meiner API. Wenn ich diese Benutzer bekomme, lösche ich alle vorhandenen und speichere die neuen. Ich verwende Android Priority Job Queue und Retrofit2, um die Anfrage zu stellen.CopyToRealm - Wert existiert bereits: null

Alle Benutzer haben IDs aus der API ausgefüllt. Aber wenn ich die realm.copyToRealm(searchResponse.getUsers()); erhalte ich: io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: null

Antwort

3

ich diese Methode, um dieses Problem

realm.copyToRealmOrUpdate(searchResponse.getUsers()) 
1

Die akzeptierte Antwort Werke zu lösen, sondern ist eine schlechte Lösung, da es die zugrunde liegende Problem versteckt:

Sie haben Objekte, bei denen das Primärschlüsselfeld auf null gesetzt ist. Es ist wahrscheinlich ein Objekt, das RealmObject erweitert, ist in der User Objekt und nicht mit @Ignore annotiert.

Hier ist ein Beispiel dafür, was passiert sein könnte:

sagen Lassen Sie Ihre User Objekt enthält ein Objekt ContactInfo, die ein Feld hat phoneNumber das gesetzt wird, der Primärschlüssel zu sein.

Einige User Objekte haben das Feld phoneNumber von ContactInfo auf null gesetzt.

Wenn Sie copyToRealm, Realm versucht, alle User Objekte hinzufügen und auch alle ContactInfo Objekte, die diese User Objekte enthalten. Bei einigen dieser ContactInfo-Objekte wird das Primärschlüsselfeld auf null gesetzt. Dies funktioniert zum ersten Mal, da die Primärschlüsselfelder vom Typ String, Byte, Short, Integer und null sein können. Aber wenn Sie es zum zweiten Mal tun, werden Sie die Primärschlüsselbeschränkung durchbrechen.

Die Verwendung von copyToRealmOrUpdate funktioniert, weil Sie nur die vorhandenen ContactInfo Objekte mit dem Primärschlüssel auf Null aktualisieren. Sie können sehen, dass dies nicht beabsichtigt ist, und Sie müssen sicherstellen, dass alle Objekte, die Sie zu Realm hinzufügen, über richtige Primärschlüssel verfügen.