gpt4 book ai didi

ios - 在已持久化对象的 RLMArray 属性中插入对象?

转载 作者:行者123 更新时间:2023-11-28 07:15:39 26 4
gpt4 key购买 nike

我有一个相当简单明了的问题,我想用 Realm 来解决。我的对象上有一个数组属性(线程)。当我通过我们的 API 获取所有线程时,它们都被保存到 Realm 中,因为父对象是单独保存的,因此数组属性中的所有子对象(消息和用户)也被正确保存。但是在应用程序的生命周期中,我需要将新消息添加到该数组属性中。这是我正在尝试做的事情:

func addPubNubMessageToThread(notification: NSNotification) {
if let info = notification.userInfo as? Dictionary<String, AnyObject> {

var embeddedMessage = Message(json: (info["data"] as? NSDictionary)!)

let threadId = (info["thread"]! as String)

// Persist the message to Realm for future use
var respectiveThread = Thread(forPrimaryKey: threadId)
let realm = RLMRealm.defaultRealm()
realm.beginWriteTransaction()
respectiveThread.conversation.insertObject(embeddedMessage, atIndex: UInt(0)) // Always fails here in XCode with the error below
realm.addOrUpdateObject(respectiveThread)
realm.commitWriteTransaction()
}
}

但每次我都会得到以下错误:

 *** Terminating app due to uncaught exception 'RLMException', reason: 'Setting unique property '_id' with existing value '540729b543dd5d1868a42b5d''

有关更多上下文,这是我的 Realm 模型:

class Message: RLMObject {
dynamic var _id = ""
dynamic var type = ""
dynamic var text = ""
dynamic var author = User()
dynamic var created = NSDate()
dynamic var lastUpdated = NSDate()
}

class Thread: RLMObject {
dynamic var _id = ""
dynamic var name = ""
dynamic var conversation = RLMArray(objectClassName: Message.className())
dynamic var participants = RLMArray(objectClassName: User.className())
dynamic var created = NSDate()
dynamic var lastUpdated = NSDate()
}

class User: RLMObject {
dynamic var _id = ""
dynamic var name = ""
dynamic var firstName = ""
dynamic var lastName = ""
dynamic var email = ""
dynamic var phone = ""
dynamic var username = ""
dynamic var avatar = NSData()
dynamic var created = NSDate()
dynamic var lastUpdated = NSDate()
}

每条消息都有一个名为 author 的属性,它所提示的 _id 是消息作者(或用户对象)的 _id。错误消息很难破译。我认为这是在说我正在尝试使用已经存在的主键创建一个新的用户对象。如果这是问题所在,我应该怎么做才能将新的 Realm 对象添加到已持久化对象的数组属性中?

编辑

我正在为每个模型设置主键,如下所示:

override class func primaryKey() -> String {
return "_id"
}

_id 是 MongoDB 生成的 GUID...所以它是全局唯一的。

最佳答案

问题是调用的时候插入对象您的对象和所有子对象都在 Realm 中创建,如果它们已经存在则不会更新。如果您首先明确更新您的对象(这也适用于所有子对象),那么这应该可以避免这个问题:

var persistedMessage = realm.addOrUpdateObject(embeddedMessage)
respectiveThread.conversation.insertObject(persistedMessage, atIndex: UInt(0))

关于ios - 在已持久化对象的 RLMArray 属性中插入对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com