当前位置: 首页 > 知识库问答 >
问题:

主键约束已断开。值已存在:0

汝臻
2023-03-14

创建的组织:

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

错误实际上是这样的:

进程:ooper.java:193,PID:5505android.app.RuntimeException:无法启动活动ComponentInfo{hread.main}:hread.java:5292RealmException:主键约束已损坏。值已存在:java.lang.reflect.ActivityTethod.invokeLaunchActive(ActivityTjava.lang.reflect.)ethod.invokeActivityTethod.java:515LaunchActive(ActivityTcom.android.internal.os.)aller.runActivityTnit.java:824800美元(ActivityTcom.android.internal.os.)android.app.ActivityThread$H. handleMessage(ActivityThread.java:1321)android.os.Handler.dispatchMessage(Handler.java:110)android.os.Looper.loop(Luz.sunet.wm)java.lang.ActivityTuz.sunet.wm/uz.sunet.wm.activities.MainActivity(ActivityTio.realm.exceptions.)android.app.Mhread.performNative(Native Method)hread.java:2338Mandroid.app.(Mhread.handle)hread.java:2390ZygoteInit$Method odAndArgsCandroid.app.(ZygoteIhread.access)hread.java:151ZygoteInit. main(ZygoteInit. java: 640)at dalvik. system。NativeStart. main(Native Method)由:io. realm.异常引起。RealmException:主要在uz. sunet. wm. active上的MyRealm. iro ateRealmData(MyRealm. java: 88)。在android. app. Activity. performCreate(Activity. java: 5264)在android. app. Instrumentation. call ActivityOnCreate(Instrumentation. java: 1088)在android. app. ActivityThread. performLaunchActive(ActivityThread. java: 2302)

我不知道发生了什么。对于第一个医生,我设置了id-0。第二个-1。但是我得到了这个错误。我做错了什么?如何解决这个问题?

共有1个答案

奚晟
2023-03-14

这是因为您正在使用领域。createObject()与具有主ID的模型类一起使用。使用createObject()时,将使用默认值创建一个新对象,包括主键的0。如果已经有主键为0的对象,将抛出主键冲突错误,就像您的情况一样。

你有两个选择:

1) 切勿将0用作对象的主键值,因为这将阻止进一步调用领域。createObject()。这也意味着您不能连续两次调用此方法。

2) 使用独立对象,然后使用领域。copyToRealm()或领域。copyToRealmOrUpdate()。这将使Realm能够在创建Realm内的任何对象之前检查主值。

我会推荐后面的方法,因为它不太容易出错。

 类似资料:
  • 问题内容: 我试图将我的SQL数据库中表的主键从现有键更改为复合键,其中不包括现有列。由于出现以下错误消息,因此以下代码无法正常工作: 删除主键: PRIMARY附近的语法不正确。预期为COLUMN,CONSTRAINT,ID或QUOTED_ID 添加主键: PRIMARY附近的语法不正确。 期望ID T-SQL代码: 编辑 我可以通过使用以下两个查询语句来完成此操作 我没有要求SQL“ DROP

  • 问题内容: 我收到以下错误: 违反主键约束’PK_ss_student_grade’。无法在对象“ dbo.ss_student_grade”中插入重复的密钥。重复密钥值为(301、1011、24801、33)。 如果我在插入之前检查表,则没有记录具有这样的主键。 插入是通过C#代码完成的,并且我确保该代码仅运行一次。即使在错误之后,如果我检查表,我仍然无法获得具有这样的主键的记录。 注意:触发器

  • 问题内容: 有没有办法给已经存在的约束命名? 例如 : 在上面的查询中,我没有命名外键约束,因此在创建表之后,我可以为其命名,也可以在不删除列的情况下删除外键约束吗? 问题答案: 是的,您可以像这样重命名约束: 编辑:我忘记了第二个问题。是的,您可以删除约束而不删除列。如果您不知道约束的名称,则可以在表中找到它,如下所示:

  • 我一直在尝试使用跨dbms数据库的迁移。使用entrust和confide包,我在它们之后添加了迁移,以添加user _ statuses表和users表中对用户状态id的引用;但是当我定义外键时,我得到了这个: 下面是user_ Status和变更迁移。user_status创建: 用户变更:

  • 问题内容: 为什么没有一个 TRUNCATE 上工作?即使我知道了: 错误1701(42000):无法截断在外键约束中引用的表(。,CONSTRAINT FOREIGN KEY()参考。()) 问题答案: 您不能在上面应用FK约束的表(与相同)。 要变通解决此问题,使用这些解决方案之一。两者都存在破坏数据完整性的风险。 选项1: 消除约束 执行 手动删除现在 无处* 引用的行 * 创建约束 选项2

  • 尝试在 Postgres 9.5 中更改表以创建外键约束时:从 到 返回错误 我很困惑为什么帖子试图找到,当密钥是从到 有什么想法吗?