如何在pull-to-refresh请求后更新realm数据库中表中已保存的实体?

时间:2017-03-02 15:18:15

标签: ios swift3 realm

我有一个iOS应用程序(swift 3)的实时(工作)版本,它使用Realm Swift(2.4.2)进行存储和离线使用。我使用简单的表作为具有主键的结构,并且(根本)没有任何关系。一切都很完美,直到我意识到调用下面的片段::

entities = fetch from web...... // pseudo

let realm = try Realm()

try realm.write {
   realm.add(entities, update: true)
}
  1. 成功添加之前在db中不存在的实体(行)(基于主键)。
  2. 更新db中存在的现有行(再次基于主键)。
  3. 不会删除用于存在于db中但不再存在的行(基于主键)
  4. 主键声明::

    override static func primaryKey() -> String? {
        return "ID"
    }
    

    其中" ID"是班级'根据领域文档的主键属性。

    无论如何作为一种解决方法,我在更新::

    之前整个表(删除)
    entities = fetch from web...... // pseudo
    
    let realm = try Realm()
    let storedObjects = realm.objects(Entity.self)
    
    try realm.write {
        realm.delete(storedObjects) // nuke entities
        realm.add(entities)
    }
    

    但我很确定必须有一个更好的方法。

    我'我们在过去的StackOverflow中找到了类似的线程,但提出的解决方案与我自己的解决方案非常相似。这不是我所做的。我正在寻找...

1 个答案:

答案 0 :(得分:0)

您可以向您的领域添加新属性,如

dynamic var lastUpdate: Double

或类似的东西。

然后你可以做

let currentMs = NSDate().timeIntervalSince1970
for entity in entities {
    entity.lastUpdate = currentMs
}

realm.add(entities, update: true)

let oldObjects= realm.objects(Entity.self).filter("lastUpdate < \(currentMs)")
realm.delete(oldObjects)

有了这个解决方案,你就不必去做&#34; nuke&#34;所有实体。但我认为它在性能方面要好得多