【问题标题】:Swift - How to update objects in bulk with out iterating over a collection of realm objectsSwift - 如何在不迭代领域对象集合的情况下批量更新对象
【发布时间】:2019-06-06 06:44:05
【问题描述】:

我的 realmDB 中有近十万条记录,每次用户根据同一张表中的其他属性更改其设备时区时,我都想重新计算特定属性。

例子:

    class Activity: Object {
        // In UTC received from server
         dynamic var effectiveDate: Date? 
        // Needs to be re-calculated everytime user launches the app based on `effectiveDate`
         dynamic var effectiveDay: Date? 
   }

假设:我的领域表中有 100,000 条此类活动记录,名为 Activities

此外,realm 指出,将 KVC 应用于集合是批量更新对象的好方法,无需在为每个项目创建访问器时迭代集合的开销。

在我的例子中,我不想为每条记录设置相同的值,而是想使用 KVC 根据effectiveDate 属性为每条记录重新计算effectiveDay,以避免迭代的开销。有可能吗?

【问题讨论】:

  • 让我重新陈述这个问题。您有一个人的结果对象,并希望将所有人的行星属性设置为“地球”。问题:每个人是否已经有一个设置为其他东西的行星属性?
  • 不,我不是这个意思。让我们一个 Person 持有两个属性 dateTime 在 UTC 和 day(在当前时区)。每当用户更改其移动时区时,我想重新计算 day 属性。
  • 问题和评论有点含糊。用户将使用什么过程来更改他们的时区。您的意思是更改 App 中的时区还是更改 iPhone 设置-> 日期和时间的时区。这导致了一个额外的问题;当时区更改时,您的应用如何通知该更改以及可以轻松地从 dateTime 派生日期属性单独存储的目的是什么?
  • 我已经更新了我的问题,它现在应该会给你更多的见解。请看一下
  • 目前还不清楚您为什么想要或需要这样做。让我重申一下这个问题:您的应用程序有一个用户并且该用户有活动。在应用程序启动时,如果用户用户更改了他们的时区,您希望根据 EffectiveDate 重新计算 EffectiveDay。听起来您要向他们展示当天的用户活动,这将通过查询来完成,您可能也不需要保留 day 属性,因为它们可以很容易地从 Date 对象中派生和查询- 如果您的设备支持时区,这将自动发生。

标签: ios swift realm realm-mobile-platform


【解决方案1】:

简答:

不遍历领域集合是不可能的 对象。

长答案:

领域是一个基于模型类的数据库。它不支持任何 查询(主要用于检索具有特定条件的数据的谓词或过滤器)如 SQLite 意味着我们无法使用 realm 更新单个查询中的所有记录。所以你的问题的答案很漂亮 直截了当,没有迭代我们无法更新值。

如果你想改变某个对象的值,你可以提高性能。

代码:

let persons = realm.objects(Person.self).filter("id IN %@", ids)
try! realm.write {
    persons.first?.setValue(true, forKeyPath: "isFirst")
    // set each person's planet property to "Earth"
    persons.setValue("Earth", forKeyPath: "planet")
}

【讨论】:

  • 也许这不是你的意思,但是它不支持像 SQLite 这样的任何查询 并不是一个准确的说法。 Realm 完全支持查询过滤器和谓词,因此您可以轻松地使用 ==、AND、OR 甚至 IN 子句进行查询——它真的非常强大,因为过滤器可以链接起来,并且返回的数据实际上是实时的——如果它改变了数据库,它会更改您的查询返回的结果。查看Realm Filtering
  • @Jay 我完全同意你的看法,但我们不能使用谓词或过滤器将所有值更新到数据库中。如果我错了,请纠正我!谓词和过滤器仅用于从数据库中获取记录。
  • 是的,它只读取数据。但是,该集中的所有数据都可以一次更改。我不确定这是否是 OP 所要求的,但您可以“一次”更改结果中的所有对象而无需迭代。
  • 我很好奇。您的回答指出 如果不进行迭代,我们无法更新值,但这正是您的代码所做的 - 它在不迭代的情况下更新值。我也发布了一个答案,但没有意识到你已经更新了你的答案。你能看看并告诉我我错过了什么吗?您的评论所说的和您的代码所做的似乎不匹配(即正确的代码,不正确的解释)?
  • 问题仍然有点模糊,OP不愿意澄清。很好地回答了手头的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2012-04-14
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多