问题追加RLMArray时,在RLMObject更新RLMArray并迅速境界3.0

问题描述:

与对象链接它需要一些方法等,其不更新现有的追随者,如果不存在这样做将它添加到数据库并将其链接到用户像问题追加RLMArray时,在RLMObject更新RLMArray并迅速境界3.0

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" 
    } 
} 

我想更新DB中用户的连接,所以我想做一些事情,如

//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 
     **********/ 
    } 
} 
+0

首先,也许不相关:为什么它的主键定义为可选?你不能有一个主键,对不对? –

+0

是的,但没有问题,我已经检查通过更新到非可选字符串 –

+0

我不确定你想要达到什么。但你在哪里设置主键?我可以看到get函数,但不是一个集合。您的错误是由于您正在尝试设置添加带有现有主键的领域对象而导致的。 – Grumme

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

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

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

我以前试过这个,但它没有工作.. –

+0

它应该工作。你能否确保将'followers'传递给'realm.add(_:update:)'? –

+0

非常感谢!遇到同样的问题,尝试添加解析的实体,该实体指向其他非托管实体,它们与托管实体具有相同的值。 –

也许情况并非如此(您的问题中没有足够的代码可以告诉),但它看起来像您在步骤1中准备userFollowers阵列以包含该特定用户的所有当前追随者。

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