【发布时间】:2017-02-03 15:33:29
【问题描述】:
我无法理解如何在 Realm 中更新对象。如果能帮助我了解更新嵌套对象的工作原理以及为什么它不能按我预期的方式工作,我将不胜感激。
我最近才开始使用 Realm,这就是我想要使用它的目的:我的服务器上存储了一组键值对,它们用作我的 iOS 应用程序中使用的字符串的本地化值。在应用程序启动时,我想更新我的字符串,所以我从服务器中提取它们并将它们本地存储在我的 iOS 设备上的领域中。我只想在我的设备上拥有这些字符串的 一个实例。
以下是课程:
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;
}
也许我遗漏了一些明显的东西,如果有人能指出我正确的方向,我将不胜感激,这样我就能够实现我正在寻找的行为(这将使嵌套对象实际更新,而不是对我的对象进行不必要的重复)。
谢谢!
【问题讨论】:
-
您是否还更新了单个
LocalizedString对象,还是重新添加了它们?不知何故,似乎后者正在发生。在写入 Realm 之前,LocalizedStrings和LocalizedString对象是如何创建和构建的?也许给LocalizedString一个主键并对这些对象进行更新会有所帮助?不过我并不乐观:P -
@Samantha,是的!为
LocalizedString添加主键解决了这个问题。谢谢