Android 主键约束已断开。值已存在:0
创建的组织:Android 主键约束已断开。值已存在:0,android,realm,Android,Realm,创建的组织: Organization organization = realm.createObject(Organization.class); // Create a new object OrganizationId organizationId = realm.createObject(OrganizationId.class); organizationId.setAggregateId("1"); organization.setOrganizati
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-Doctor=realm.createObject(Doctor.class);
//全名
FullName FullName=realm.createObject(FullName.class);
全名。setFirstName(“乔”);
全名。setLastName(“Richard”);
全名。setMiddleName(“布朗”);
医生:setFullName(全名);
//接触
Contacts=realm.createObject(Contacts.class);
RealmList phonenumberrelalmlist=新的RealmList();
PhoneNumber pn=realm.createObject(PhoneNumber.class);
pn.设置电话号码(“+998903735173”);
添加(0,pn);
联系人。设置电话号码(电话号码列表);
医生。设置联系人(联系人);
//组织机构
组织(组织)博士;
//专业化
RealmList specializationRealmList=新的RealmList();
专门化=realm.createObject(专门化.class);
专业化。设置专业化名称(“ПааааааГ”);
专门化realmlist.add(0,专门化);
医生设置专业列表(specializationRealmList);
当我添加第二个医生时,我得到了错误(错误堆栈如下所示):
Doctor doctor2=realm.createObject(Doctor.class)//
//全名
FullName fullName2=realm.createObject(FullName.class);
全名2.setFirstName(“Bob”);
全名2.setLastName(“理查森”);
全名2.setMiddleName(“布朗诺维奇”);
doctor2.setFullName(fullName2);
//接触
Contacts contacts2=realm.createObject(Contacts.class);
RealmList phonenumberrelalmlist2=新的RealmList();
PhoneNumber pn2=realm.createObject(PhoneNumber.class);
pn2.设置电话号码(“+998903720757”);
电话号码relalmlist2.add(1,pn2);
contacts2.设置电话号码(phoneNumberRealmList2);
医生2.设置触点(触点2);
//组织机构
博士2.组织(机构);
//专业化
RealmList specializationRealmList2=新的RealmList();
Specialization specialization2=realm.createObject(Specialization.class);
专业化2.设置专业化名称(“Уцццц”);
specializationRealmList2.add(1,specialization2);
博士2.setSpecializationList(specializationRealmList2);
错误实际上是这样的:
流程:uz.sunet.wm,PID:5505
java.lang.RuntimeException:无法启动活动组件信息{uz.sunet.wm/uz.sunet.wm.activities.MainActivity}:
io.realm.exceptions.RealmException:主键约束已断开。
值已存在:0
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
在android.app.ActivityThread.access$800(ActivityThread.java:151)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
位于android.os.Handler.dispatchMessage(Handler.java:110)
位于android.os.Looper.loop(Looper.java:193)
位于android.app.ActivityThread.main(ActivityThread.java:5292)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:824)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
在dalvik.system.NativeStart.main(本机方法)
原因:io.realm.Exception.realmeException:主键约束已断开。值已存在:0
在io.realm.internal.Table.throwDuplicatePrimaryKeyException(Table.java:731)中
位于io.realm.internal.Table.addEmptyRow(Table.java:380)
位于io.realm.realm.createObject(realm.java:1037)
位于uz.sunet.wm.data.MyRealm.initiateRealmData(MyRealm.java:88)
位于uz.sunet.wm.activities.MainActivity.onCreate(MainActivity.java:60)
位于android.app.Activity.performCreate(Activity.java:5264)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
在android.app.ActivityThread.access$800(ActivityThread.java:151)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
位于android.os.Handler.dispatchMessage(Handler.java:110)
位于android.os.Looper.loop(Looper.java:193)
位于android.app.ActivityThread.main(ActivityThread.java:5292)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:824)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
在dalvik.system.NativeStart.main(本机方法)
我不知道发生了什么事。对于第一个医生,我将id设置为-0。第二名-1。然而,我得到了这个错误。我做错了什么?如何解决此问题?这是因为您正在将
Realm.createObject()
与具有主ID的模型类一起使用。当您使用createObject()
时,将使用默认值创建一个新对象,包括主键的0。如果已经有主键为0的对象,将抛出主键冲突错误,就像您的情况一样
您有两个选择:
1) 切勿将0用作对象的主键值,因为这将阻止进一步调用Realm.createObject()
。这也意味着您不能连续两次调用此方法
2) 使用独立对象和
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);