【问题标题】:Unable to change the value of primary key in Realm Android无法在 Realm Android 中更改主键的值
【发布时间】:2017-09-08 12:32:03
【问题描述】:

我正在尝试将主键的当前值更改为另一个值。像这样。

realm?.executeTransactionAsync ({ realm ->
    val teamRealmObj = realm?.where(Team::class.java)?.equalTo("name", oldTeamName)?.findFirst()
        teamRealmObj?.name = newTeamName
    })

这里的name属性是一个主键。

我收到了这个错误。

创建对象后无法更改失败的主键字段“名称”。

我怎样才能做到这一点?我是否必须制作副本(只有不同​​的名称属性)并删除旧的?这会在一对多或多对多关系中引起头痛,因为必须在数据库中的每个位置替换新对象。

需要更好的方法来做到这一点。如果有人能帮我解决这个问题,谢谢。

【问题讨论】:

  • Do I have to make an exact copy and delete the old one? 是的,尽管copyFromRealm() 可以提供帮助
  • 没有。我的需要只是更改数据库中现有 RealmObject 的名称属性。
  • 托管对象创建后不能修改主键的值
  • 在Realm中是完全不可能的吗?
  • 是的,使用copyFromRealm()创建副本,修改主键,插入新对象,删除旧对象。删除对象会使对象链接失效,因此您需要为关系重建链接。另一种选择是使用迁移使其不是主键,但随后您需要使用copyToRealm()/insert(),并且您需要手动进行更新,并确保您没有重复.

标签: android realm realm-migration


【解决方案1】:

这段代码解决了我的问题。

realm?.executeTransactionAsync ({ realm ->
        val teamRealmObj = realm.where(Team::class.java)?.equalTo("name", oldTeamName)?.findFirst()
        val newTeamObj = realm.copyFromRealm(teamRealmObj)
        newTeamObj?.name = newTeamName
        realm.copyToRealmOrUpdate(newTeamObj)
        teamRealmObj?.deleteFromRealm()
    }

无需重新创建链接。

realm.copyToRealmOrUpdate(newTeamObj)

这一行会自动执行此操作。

【讨论】:

  • 希望你的链接对象也有主键?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多