【问题标题】:Delete specific object from LinkingObjects list - Realm Swift从 LinkingObjects 列表中删除特定对象 - Realm Swift
【发布时间】:2018-07-11 03:44:34
【问题描述】:

我目前正在一个测试项目中试用 Realm,并且一直在努力从列表中删除特定对象。 LensDBObject 和 ListDBObject。 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 吗?

感谢您的帮助!

【问题讨论】:

    标签: swift realm rlmlinkingobjects


    【解决方案1】:

    试试这样的。您只想从列表中删除镜头,而不是从领域中删除它。

    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。此外,我们必须一次完成一项,而不是先获取所有索引,因为删除一项会导致索引数组出错。

    【讨论】:

    • 感谢您的帮助!现在我明白了为什么在 RealmBrowser 上,当我右键单击列表中的镜头时,我会得到以下选项:从数组中删除对象或从数组中删除对象并删除。它需要被删除,而不是被删除。它有效:)
    • 我很高兴它成功了,我只是在文本编辑器中输入了它而没有测试!
    • filteredResults.forEach({ _ in listToSearch[0].lensList.remove(at: 0) }) 是正确的代码fwiw :)
    • 不,那是不同的。 remove(at: 0) 将删除第一个元素。 $0 将使用传递给forEach 的参数(您标记为下划线的那个)。见:stackoverflow.com/questions/36144322/…
    • 抱歉耽搁了。如果我尝试filteredResults.forEach{listToSearch[0].lensList.remove(at: $0)},那么 $0 指的是 lensDBObject 而不是索引 (Int)。我正在从 tableView 中删除,因此过滤结果一次应该只返回 1 个结果,但无论如何我都会有兴趣以正确的方式进行操作。
    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多