我有一个使用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”。抱歉造成混乱。
答案 0 :(得分:1)
您的模型包含一个名为id
的属性。但是您的谓词会检查名为parentId
或childId
的属性。
除此之外,仅根据其ID删除子对象而不先检索其父对象可能会更容易。另一种选择是使用主键,这使您可以直接使用realm.object(ofType: Child.self, forPrimaryKey: childId)
来获取子代。
答案 1 :(得分:0)
事实证明,这是Realm中的错误,自3.17.1起已得到解决。