2015-05-11 44 views
5

創建組織:主鍵約束被破壞。值已經存在: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()); 

當我添加新的醫生與該組織一切正常。應用工作沒有任何錯誤:

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); 

當我添加第二個醫生,我得到錯誤(錯誤堆棧是向下跌破):

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); 

錯誤實際上是這樣的:

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)

我不知道發生了什麼事。對於第一個醫生我設置ID - 0.第二 - 1.但是我得到這個錯誤。我做錯了什麼?如何解決這個問題呢?

回答

8

這是因爲您正在使用Realm.createObject()以及具有主ID的模型類。當您使用createObject()時,將使用默認值創建一個新對象, 0爲主鍵。如果您已經擁有主鍵爲0的對象,則會拋出主鍵違例錯誤,就像您的情況一樣。

你有兩個選擇:

1)不要使用0作爲你的對象主鍵值,因爲這會阻止進一步呼籲Realm.createObject()。這也意味着你不能連續調用這個方法兩次。

2)使用獨立對象,然後使用Realm.copyToRealm()Realm.copyToRealmOrUpdate()。這將使Realm在Realm內創建任何對象之前檢查主值。

我會推薦以後的方法,因爲它不太容易出錯。

相關問題