领域过滤器不总是查找数据吗?

时间:2019-06-06 18:24:19

标签: swift filter realm

我有一个使用Realm作为数据库的Swift应用程序。在应用程序中,我定义了几个模型,如下所示:

class Child: Object {
    @objc dynamic var id: Int = generateChildId()
    //other properties removed
}

class Parent: Object {
    @objc dynamic var id: Int = generateParentId()
    let children = List<Child>()
    //other properties removed
}

在我的应用程序的其他地方,我有一个删除子对象的方法,如下所示:

static func deleteChild(parentId: Int, childId: Int) {
    do {
        let realm = try Realm()
        realm.refresh()
        guard let parent = realm.objects(Parent.self).filter("id == %@", parentId).first else {
            print("Parent with ID: \(parentId) was not found!")
            return
        }

        guard let child = parent.children.filter("id == %@", childId).first else {
            print("Child with ID: \(childId) was not found!")
            print("This parent object has \(parent.children.count) children:")
            for child in parent.children {
               print("child ID: \(child.id)")
            }
            return
        }

        realm.delete(child)
    } catch {
        log.error(error)
    }
}

Child对象显示在UITableView中。当我尝试删除Child对象时,我将ID打印到Xcode控制台,然后调用上面的deleteChild(parentId:childId)方法。在大多数情况下,这可以按预期进行。但是有时,按ID筛选Child对象的代码无法找到匹配的对象,并显示“ ID为X的子代未找到!”。到控制台。发生这种情况时,我将遍历Parent对象的.children属性并打印出所有Child对象。真正令我困惑的是,当我这样做时,我尝试查找和删除的Child对象似乎在那里。例如:

Child with ID: 1559835636225 was not found!

This parent object has 5 children:
child ID: 1559835626285
child ID: 1559835628608
child ID: 1559835636225
child ID: 1559835643522
child ID: 1559835653041

知道我在做什么错吗?

---更新---

我的原始帖子在谓词中包含不正确的属性名称(parentId和childId,而不仅仅是id)。在我尝试在发布之前进行清理的实际代码中,属性名称正确地指定为“ id”。抱歉造成混乱。

2 个答案:

答案 0 :(得分:1)

您的模型包含一个名为id的属性。但是您的谓词会检查名为parentIdchildId的属性。

除此之外,仅根据其ID删除子对象而不先检索其父对象可能会更容易。另一种选择是使用主键,这使您可以直接使用realm.object(ofType: Child.self, forPrimaryKey: childId)来获取子代。

答案 1 :(得分:0)

事实证明,这是Realm中的错误,自3.17.1起已得到解决。