我有一个使用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)
    }
}

子对象显示在UITableView中。当我试图删除一个子对象时,我将ID打印到Xcode控制台,然后调用上面的deleteChild(parentId:childId)方法。大多数情况下,这是按预期工作的。但有时,按ID筛选子对象的代码找不到匹配的对象并打印“找不到ID:X的子对象!”到控制台。发生这种情况时,我遍历父对象上的.children属性并打印出所有子对象。真正让我困惑的是,当我这样做时,我试图找到并删除的子对象似乎就在那里。例如:
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”。对不起,我有点困惑。

最佳答案

您的模型包含一个名为id的属性。但是谓词检查名为parentIdchildId的属性。
除此之外,只根据子项的id删除子项可能更容易,而不必首先检索其父项。另一个选项是使用主键,它允许您直接使用realm.object(ofType: Child.self, forPrimaryKey: childId)获取子项。

08-25 22:02