领域过滤器并不总能找到数据?

Realm filter not always finding data?

我有一个 Swift 应用程序使用 Realm 作为其数据库。在应用程序中,我有几个这样定义的模型:

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)
    }
}

子对象显示在 UITableView 中。当我尝试删除一个 Child 对象时,我将 ID 打印到 Xcode 控制台,然后调用上面的 deleteChild(parentId:childId) 方法。大多数情况下,这会按预期工作。但有时,通过 ID 过滤 Child 对象的代码无法找到匹配的对象并向控制台打印 "Child with ID: X was not found!"。发生这种情况时,我遍历 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

知道我做错了什么吗?

---更新---

我原来的 post 在谓词中包含不正确的 属性 名称(parentId 和 childId 而不仅仅是 id)。在我尝试在 posting 之前清理的实际代码中,属性 名称被正确指定为 "id"。抱歉造成混淆。

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

的 属性

除此之外,仅根据其 id 删除子项可能更容易,而无需先检索其父项。另一种选择是使用主键,它允许您直接使用 realm.object(ofType: Child.self, forPrimaryKey: childId).

获取子项

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