从LinkingObjects列表中删除特定对象 - Realm Swift

时间:2018-01-31 22:04:42

标签: swift realm rlmlinkingobjects

我目前正在测试项目中的Realm,我一直在努力从List中删除特定对象。 LensDBObjectListDBObject。 LensDBObject包含镜头列表,ListDBObject包含现有镜头列表。镜头可以在多个列表中,我想从特定列表中删除特定镜头,但不能从其他列表中删除。

以下是我的两个班级:

@objcMembers class LensDBObject: Object {

   dynamic var id = UUID().uuidString
   dynamic var manufacturer = ""
   dynamic var series = ""
   dynamic var serial = ""
   dynamic var isSelected = false

   override static func primaryKey() -> String? {
       return "id"
   }

   let objects = LinkingObjects(fromType: ListDBObject.self, property: "lensList")

}

@objcMembers class ListDBObject: Object {
   dynamic var listName = ""
   let lensList = List<LensDBObject>()

}

下面是我在我想要的列表中找到特定镜头的代码。返回的值是我所期望的。

let listToSearch = realm.objects(ListDBObject.self).filter("listName == %@", "List 542")
print(listToSearch)
let filteredResults = listToSearch[0].lensList.filter("manufacturer == %@ AND series == %@ AND serial == %@", "Panavision" , "Primo Prime", "407")
print(filteredResults)

但是,当我尝试删除filteredResults时,它会从lensDBOject中删除它。我只想从这个特定列表中删除这个特定的镜头。

try! realm.write {
    realm.delete(filteredResults)
}

我尝试使用for循环来获取列表中镜头的索引,然后直接从中删除它。但它仍然在任何地方删除镜头。

我错过了什么吗?我应该使用一对多关系而不是LinkingObject吗?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

尝试这样的事情。您只想从列表中删除镜头,而不是从Realm中删除它。

try! realm.write {
    filteredResults.forEach { lens in
        if let index = listToSearch[0].lensList.index(of: lens) {
            listToSearch[0].lensList.remove(at: index)
        }
    }
}

请注意,这将从该特定列表中删除与您的过滤器匹配的所有镜头。

修改:已更新,以反映Realm的自定义List课程。

if let是必需的,因为如果在列表中找不到该对象,index(of:)可能会返回nil。另外,我们必须一次只执行一项,而不是先获取所有索引,因为删除项会导致索引数组错误。