2015-05-11 17 views
5

Utworzono organizacja:Zerwane klucz podstawowy. Wartość już istnieje: 0

Organization organization = realm.createObject(Organization.class); // Create a new object 
    OrganizationId organizationId = realm.createObject(OrganizationId.class); 
    organizationId.setAggregateId("1"); 
    organization.setOrganizationId(organizationId); 
    organization.setOrganizationName("1-я Клиника Ташкентской Медицинской Академии"); 
    organization.setAddress("Адрес: г. Ташкент, ул. Фароби, 2"); 
    organization.setPhoneNumber("Тел.: (+99871) 214-51-01, 214-50-86, 214-50-43"); 
    organization.setKey(organization.getOrganizationName().toLowerCase()); 

Kiedy dodać nowego lekarza z tą organizacją wszystko jest w porządku. Aplikacja działa bez błędu:

Doctor doctor = realm.createObject(Doctor.class); 
    //FULL NAME 
    FullName fullName = realm.createObject(FullName.class); 
    fullName.setFirstName("Joe"); 
    fullName.setLastName("Richard"); 
    fullName.setMiddleName("Brown"); 
    doctor.setFullName(fullName); 
    //CONTACTS 
    Contacts contacts = realm.createObject(Contacts.class); 
    RealmList<PhoneNumber> phoneNumberRealmList = new RealmList<>(); 
    PhoneNumber pn = realm.createObject(PhoneNumber.class); 
    pn.setPhoneNumber("+998903735173"); 
    phoneNumberRealmList.add(0, pn); 
    contacts.setPhoneNumbers(phoneNumberRealmList); 
    doctor.setContacts(contacts); 
    //ORGANIZATION 
    doctor.setOrganization(organization); 
    //SPECIALIZATION 
    RealmList<Specialization> specializationRealmList = new RealmList<>(); 
    Specialization specialization = realm.createObject(Specialization.class); 
    specialization.setSpecializationName("Ревматолог"); 
    specializationRealmList.add(0, specialization); 
    doctor.setSpecializationList(specializationRealmList); 

Po dodaniu drugiego lekarza otrzymuję błąd (błąd stosu jest na dole):

Doctor doctor2 = realm.createObject(Doctor.class);// 
//FULL NAME 
FullName fullName2 = realm.createObject(FullName.class); 
fullName2.setFirstName("Bob"); 
fullName2.setLastName("Richardson"); 
fullName2.setMiddleName("Brownowich"); 
doctor2.setFullName(fullName2); 
//CONTACTS 
Contacts contacts2 = realm.createObject(Contacts.class); 
RealmList<PhoneNumber> phoneNumberRealmList2 = new RealmList<>(); 
PhoneNumber pn2 = realm.createObject(PhoneNumber.class); 
pn2.setPhoneNumber("+998903720757"); 
phoneNumberRealmList2.add(1, pn2); 
contacts2.setPhoneNumbers(phoneNumberRealmList2); 
doctor2.setContacts(contacts2); 
//ORGANIZATION 
doctor2.setOrganization(organization); 
//SPECIALIZATION 
RealmList<Specialization> specializationRealmList2 = new RealmList<>(); 
Specialization specialization2 = realm.createObject(Specialization.class); 
specialization2.setSpecializationName("Уролог"); 
specializationRealmList2.add(1, specialization2); 
doctor2.setSpecializationList(specializationRealmList2); 

błędu jest rzeczywiście tak:

Process: uz.sunet.wm, PID: 5505 java.lang.RuntimeException: Unable to start activity ComponentInfo{uz.sunet.wm/uz.sunet.wm.activities.MainActivity}: io.realm.exceptions.RealmException: Primary key constraint broken. Value already exists: 0 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) at dalvik.system.NativeStart.main(Native Method) Caused by: io.realm.exceptions.RealmException: Primary key constraint broken. Value already exists: 0 at io.realm.internal.Table.throwDuplicatePrimaryKeyException(Table.java:731) at io.realm.internal.Table.addEmptyRow(Table.java:380) at io.realm.Realm.createObject(Realm.java:1037) at uz.sunet.wm.data.MyRealm.initiateRealmData(MyRealm.java:88) at uz.sunet.wm.activities.MainActivity.onCreate(MainActivity.java:60) at android.app.Activity.performCreate(Activity.java:5264) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)             at android.app.ActivityThread.access$800(ActivityThread.java:151)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)             at android.os.Handler.dispatchMessage(Handler.java:110)             at android.os.Looper.loop(Looper.java:193)             at android.app.ActivityThread.main(ActivityThread.java:5292)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)             at dalvik.system.NativeStart.main(Native Method)

Nie mam pojęcia, co się dzieje. Dla pierwszego lekarza ustawiłem id - 0. Po drugie - 1. Jednak dostaję ten błąd. Co robię źle? Jak rozwiązać ten problem?

Odpowiedz

8

Jest tak, ponieważ używasz Realm.createObject() razem z klasą modelu, która ma podstawowy identyfikator. Podczas korzystania z createObject() tworzony jest nowy obiekt z wartościami domyślnymi, w tym. 0 dla klucza podstawowego. Jeśli masz już obiekt z kluczem podstawowym 0, zostanie zgłoszony błąd naruszenia klucza głównego, tak jak w twoim przypadku.

Masz dwie opcje:

1) Nigdy nie używaj 0 jako wartość klucza podstawowego dla swoich obiektów, jako że uniemożliwi dalsze połączenia do Realm.createObject(). Oznacza to również, że nie można wywołać tej metody dwa razy z rzędu.

2) Użyj obiektów niezależnych, a następnie użyj Realm.copyToRealm() lub Realm.copyToRealmOrUpdate(). Umożliwi to Realowi sprawdzenie wartości podstawowej przed utworzeniem jakichkolwiek obiektów w Królestwie.

Polecam późniejsze podejście, ponieważ jest mniej podatne na błędy.

Powiązane problemy