Swift Core-Data 从属性列表中删除项目

Posted

技术标签:

【中文标题】Swift Core-Data 从属性列表中删除项目【英文标题】:Swift Core-Data delete items from attribute list 【发布时间】:2020-08-12 12:58:13 【问题描述】:

我正在从事一个核心数据项目。 目前我有一个具有以下属性的实体(项目):

@NSManaged public var title: String?
@NSManaged public var list: [String]

我正在使用带有 ForEach 的列表在列表中显示实体。如果用户选择一个项目,我会通过导航链接打开另一个视图。

主列表代码:

struct ItemList: View 
@Environment(\.managedObjectContext) var viewContext
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Item.title, ascending: true)]) 
var ItemFetch: FetchedResults<Item>

   var body: some View 
      NavigationView 
         List 
            ForEach(ItemFetch, id: \.self item in
               NavigationLink(destination: ItemView(Item: item) 
                  Text(item.title)
               
            
            .onDelete(perform: removeItem(at:))
         
      
   
   private func removeItem(at offsets: IndexSet) 
           for index in offsets 
               let item = ItemFetch[index]
               viewContext.delete(item)
        
    

二次查看代码:

struct ItemView: View 

@Environment(\.managedObjectContext) var viewContext
@ObservedObject var Item: Item

var body: some View
NavigationView 
   List 
      ForEach  Item.list.indices  entry in
         Text(self.Item.list[entry]
      
   
   .navigationBarItem(
          trailing:
               Button(action: 
                   self.Item.list.append("SubItem")
       ) 
                   Text("Add SubItem")
        )
      
   

用户可以通过按下按钮将子项添加到列表中。

项目列表中的项目也可以通过滑动删除。

现在我希望用户也可以通过滑动来删除子项列表中的子项。 如果我尝试实现相同的功能,那么用户将通过删除我不想要的 SubItem 来删除 Item。

我不知道如何使用 FetchRequest 只获取名为 list 的属性。有没有办法这样做或以其他方式删除子项?

谢谢。

【问题讨论】:

【参考方案1】:

问题中发布的代码实际上不起作用。

如果您希望能够对子项运行查询,您可能需要为它们创建一个新实体,并使用 Core Data 一对一关系链接这两个实体。

如果你想坚持一个字符串数组来存储子项,你可以通过添加来实现滑动删除功能:

.onDelete(perform: removeSubItem(at:))

到ItemView中的ForEach,即

ForEach(Item.list, id: \.self)  entry in // you should actually call it "item" to avoid confusion...
    Text(entry)
.onDelete(perform: removeSubItem(at:))

removeSubItem可能看起来像这样:

private func removeSubItem(at offsets: IndexSet) 
    for index in offsets 
        Item.list.remove(at: index)  // you should actually call it "item" to avoid confusion...
        try? viewContext.save()
    

【讨论】:

嘿 Lobo,很遗憾,即使这是解决方案,我也无法支持您的答案。非常感谢你。现在,我将坚持使用数组,直到我了解更多关于核心数据关系的知识。

以上是关于Swift Core-Data 从属性列表中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?

在 <div> 无序列表项中删除并重新添加类属性

IOS/objective-c/core-data:如何从相关实体获取属性

从 Core-Data 请求不同的 NSManagedObject 属性实例时返回啥类?

在单个 NSTableView (Core-Data) 中显示来自多个实体的数据

使用 Python 删除对象列表中的重复项