Ich benutze Realm 3.4.0 und habe ein Objekt, das ein Singleton sein sollte. Die Datenbank wird synchronisiert.Realm findet keine vorhandenen Objekte
Hier ist eine vereinfachte Version des Codes: test ob das Objekt existiert, füge es hinzu, wenn es nicht existiert. Was ist der richtige Weg? (CopyToRealmOrUpdate sollte nicht erforderlich sein, oder gibt es einen anderen Grund, warum die Instanz null wird?)
@PrimaryKey
public long id = 1;
public static PlannerManager getInstance(Realm realm) {
PlannerManager ourInstance = null;
if (instanceLock == null)
instanceLock = new ReentrantLock();
try {
instanceLock.lock();
realm.refresh(); // Force getting all data from online database
ourInstance = realm.where(PlannerManager.class).findFirst();
if (ourInstance == null) { // The item doesn't exist
realm.beginTransaction();
ourInstance = realm.copyToRealm(new PlannerManager()); // Crashes sometimes with the error that an object with primary ID already exists
realm.commitTransaction();
}
} finally {
instanceLock.unlock();
}
return ourInstance;
}
Relevante Teil des stacktrace
2:9.446 Primary key value already exists: 1 .
(/Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsObject.cpp:189) io.realm.exceptions.RealmPrimaryKeyConstraintException: Primary key value already exists: 1 .
(/Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsObject.cpp:189)
at io.realm.internal.OsObject.nativeCreateNewObjectWithLongPrimaryKey(Native Method)
at io.realm.internal.OsObject.createWithPrimaryKey(OsObject.java:198)
at io.realm.Realm.createObjectInternal(Realm.java:1052)
at io.realm.PlannerManagerRealmProxy.copy(PlannerManagerRealmProxy.java:1279)
at io.realm.PlannerManagerRealmProxy.copyOrUpdate(PlannerManagerRealmProxy.java:1268)
at io.realm.DefaultRealmModuleMediator.copyOrUpdate(DefaultRealmModuleMediator.java:438)
at io.realm.Realm.copyOrUpdate(Realm.java:1660)
at io.realm.Realm.copyToRealm(Realm.java:1072)
at com.myapp.internal.PlannerManager.getInstance(PlannerManager.java:857)
Dank!
Stack-Trace für Absturz wäre nett zu haben, wenn es existiert. – EpicPandaForce
Ihr Primärschlüssel 'id' ist immer 1. Sie müssen für jede Instanz einen eindeutigen Primärschlüssel erstellen. – cykopath
@cykopath Es sollte nur eine einzige Instanz geben, deshalb habe ich den Primärschlüssel 1, so dass er nicht verdoppelt werden kann, und suche nach einer Instanz, bevor ich die einzige Instanz einfüge, die existieren sollte. – Mackan