【问题标题】:issue when appending the RLMArray, update RLMArray in RLMObject and link it with object in swift realm 3.0附加 RLMArray 时出现问题,更新 RLMObject 中的 RLMArray 并将其与 swift realm 3.0 中的对象链接
【发布时间】:2017-01-07 20:18:23
【问题描述】:

想要一些更新现有关注者的方法,如果不存在,请将其添加到数据库并将它们链接到类似用户

GETS CRASH OVER 附加在写入块中,由于重复的主键, 另外,如果 HKUser 表中没有添加关注者,它会完美运行,一旦更新它就会崩溃

import UIKit
import RealmSwift
class HKUser: Object{
    dynamic var full_name = ""
    dynamic var email: String?
    dynamic var user_id: String?
    let followers = List<HKUser>()

    override static func primaryKey() -> String? {
        return "user_id"
    }
}

我也想更新数据库中用户的连接,所以我想做一些类似的事情

//1. updated the userFollower array with required data
let userFollowers:[HKUser] = []

//2. now need to link it with my user object and update it in db
if let user = realmWrapper.sharedInstance.getUser(forID: id) {
    try! realm.write {
        //want some method like which do update the existing followers,
        //and if not exists do add it to db and link them to user something like
        //realm.add(user, update: true)

        user.followers.append(contentsOf: followers)
        /**********
         GETS CRASH OVER HERE,
         due to duplicate primary key,
         it works perfect if no followers has been added in HKUser Table,
         once it comes to update it crashes
         **********/
    }
}

【问题讨论】:

  • 第一件事,也许不相关:为什么它是你的主键定义为可选?你不能有一个空主键,对吧?
  • 是的,但这不是问题,我已经通过更新到非可选字符串来检查
  • 我不太确定你想要实现什么。但是你在哪里设置主键?我可以看到 get 函数,但不是 set。您的错误是因为您尝试使用现有主键设置添加领域对象。

标签: ios arrays swift realm


【解决方案1】:

List&lt;T&gt;.append() 方法如果对象是非托管的,则隐式保存到领域。这就是重复主键异常发生的原因。

为避免这种情况,您可以在附加到列表之前添加或更新非托管对象。然后将对象附加到列表中。

try! realm.write {
    ...
    realm.add(followers, update: true) // Add or update the objects first
    user.followers.append(contentsOf: followers)
    ...
}

【讨论】:

  • 它应该可以工作。你能确保将followers 传递给realm.add(_:update:) 吗?
  • 非常感谢!遇到同样的问题,尝试添加解析的实体,该实体指向其他非托管实体,这些实体与托管实体具有相同的值。
【解决方案2】:

也许情况并非如此(您的问题中没有足够的代码可以说明)但看起来您在步骤 1 中准备了 userFollowers 数组以包含该特定用户的所有当前关注者。

如果是这种情况,那么您最终将重新添加所有现有的追随者,不仅是新的追随者,因此还有重复的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多