【问题标题】:Realm is creating multiple entries for nested objects on updateRealm 在更新时为嵌套对象创建多个条目
【发布时间】: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 之前,LocalizedStringsLocalizedString 对象是如何创建和构建的?也许给LocalizedString 一个主键并对这些对象进行更新会有所帮助?不过我并不乐观:P
  • @Samantha,是的!为LocalizedString 添加主键解决了这个问题。谢谢

标签: ios swift3 realm


【解决方案1】:

好的,answer 帮助我弄清楚我的设置出了什么问题。我在 LocalizedString 类中缺少 primaryKey。

根据上面关于realm.add(object, update: true) 工作原理的答案:

文档:

  • 参数对象:要添加到此 Realm 的对象。
  • 参数更新:如果true,Realm 将尝试查找对象的现有副本(具有相同的主 键),并更新它。否则,将添加对象。

所以嵌套对象也会发生同样的事情。除非他们有primaryKey,否则他们不能被更新。

【讨论】:

  • 对我不起作用。我有 Media 对象,其中嵌套了 Comment 对象。如果我没有为Comment 实现primaryKey - 它通常会复制所有Comment 对象,如果我为Comment 实现primaryKey - 它会抛出Can't create object with existing primary key value '.....' primaryKeyMedia 实现并添加Media 在 Realm 中就像这样 BaseStorage.add(media, update: true)
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多