领域过滤器并不总能找到数据?
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
的 属性。但是您的谓词检查名为 parentId
或 childId
.
的 属性
除此之外,仅根据其 id 删除子项可能更容易,而无需先检索其父项。另一种选择是使用主键,它允许您直接使用 realm.object(ofType: Child.self, forPrimaryKey: childId)
.
获取子项
事实证明,这是 Realm 中的一个错误,自 3.17.1 以来已得到解决。
我有一个 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
的 属性。但是您的谓词检查名为 parentId
或 childId
.
除此之外,仅根据其 id 删除子项可能更容易,而无需先检索其父项。另一种选择是使用主键,它允许您直接使用 realm.object(ofType: Child.self, forPrimaryKey: childId)
.
事实证明,这是 Realm 中的一个错误,自 3.17.1 以来已得到解决。