我在理解更新对象在Realm中的工作方式时遇到了麻烦。我非常感谢帮助我了解如何更新嵌套对象的工作方式以及为什么它不按我预期的方式工作。
我最近刚开始使用Realm,这就是我想要用它的原因:我的服务器上存储了一组键值对,用作我iOS应用中使用的字符串的本地化值。在应用程序启动时,我偶尔会想要更新我的字符串,因此我将它们从服务器中拉出来并将它们本地存储在我的iOS设备上。我想在我的设备上只有 ONE实例这些字符串。
以下是课程:
import RealmSwift
public class LocalizedStrings: Object {
dynamic var id = 1
dynamic var version: String = ""
let assets = List<LocalizedString>()
override public static func primaryKey() -> String? {
return "id"
}
}
public class LocalizedString: Object {
dynamic var key: String = ""
dynamic var value: String = ""
}
以下是我更新LocalizedStrings对象的方法:
realm.add(localizedStrings, update: true)
以下是我访问字符串的方法:
func getLocalizedString(forKey key: String) -> String {
var result = key
try! realm.write {
let queryResult = realm.objects(LocalizedString.self).filter("key == %@", key)
// print(queryResult)
if queryResult.count == 1 {
result = queryResult[0].value(forKey: "value") as! String
}
}
return result
}
现在,我希望,每当我更新LocalizedStrings时,localizedStrings.assets
列表都会更新新值。但相反,资产没有更新,列表引用更新,我最终得到了相同字符串的多个实例,这不是我对更新函数的期望。当我尝试访问特定的LocalizedString时,它发现了多个实例:
(...)
[19] LocalizedString {
key = update;
value = Update;
},
[20] LocalizedString {
key = update;
value = Update;
}
也许我错过了一些明显的东西,如果有人能指出我正确的方向,我会非常感激,所以我能够实现我正在寻找的行为(这将是让嵌套对象实际更新,而不是对我的对象进行不必要的重复)。
谢谢!
答案 0 :(得分:1)
好的,所以这个answer让我弄明白,我的设置出了什么问题。我在LocalizedString类中缺少primaryKey。
从以上关于realm.add(object, update: true)
如何运作的答案:
文档:
- 参数object:要添加到此Realm的对象。
- 参数更新:如果
true
,Realm将尝试查找对象的现有副本(具有相同的主要副本 密钥),并更新它。否则,将添加该对象。
所以嵌套对象也会发生同样的事情。除非他们有primaryKey,否则无法更新它们。