CoreData关系一对一无法显示属于每个Listing的标签数组[重复]

Posted

技术标签:

【中文标题】CoreData关系一对一无法显示属于每个Listing的标签数组[重复]【英文标题】:CoreData relation one-to-one can not display array of Tags belonging to each Listing [duplicate] 【发布时间】:2021-05-24 11:13:39 【问题描述】:

我有两个实体列表和标签。该关系运行良好,并且也保存到 Core Data。

class JSONViewModel: ObservableObject 

@Published var listings: [ListingModel] = []


// saving Json to Core Data...
func saveData(contex: NSManagedObjectContext) 
        
        listings.forEach()  (data) in
               
        let listingFetch: NSFetchRequest<Listing> = Listing.fetchRequest()
          listingFetch.predicate = NSPredicate(format: "id = %@",  "\(Int64(data.id))")
               
            do 
             let results:[Listing] = try contex.fetch(listingFetch)
                if results.count == 0 

                   let entity = Listing(context: contex)
                    entity.id = Int64(data.id)
                    entity.title = data.title
                    entity.name = data.name
                    entity.category = data.category
                    entity.permalink = data.permalink
                    data.tags.forEach  (tagData) in
                        let tags = Tag(context: contex)
                        tags.name = tagData
                        tags.toListing = entity
                                     
                    try? contex.save()
                   print ("Inserted Listing")
                
                else
                
                   let entity = results[0]
                    entity.id = Int64(data.id)
                    entity.title = data.title
                    entity.name = data.name
                    entity.category = data.category
                    entity.permalink = data.permalink
                    data.tags.forEach  (tagData) in
                        let tag = Tag(context: contex)
                        tag.name = tagData
                        tag.toListing = entity
                    
                    try? contex.save()
                    print ("Updated Listing: ID: \(entity.id); Title: \(String(describing: entity.title)); Tags: \(String(describing: data.tags))")
                    
                
                
             catch let error as NSError 
                print("error inserting / updating Listing \(error), \(error.userInfo)")
            
        
  
    
  

保存数据后的打印如下所示。

Printscreen

所以eatch Listing 有一个标签数组。

问题是当我尝试在 Lisiting 详细视图中显示它们时,我得到一个空视图。

我尝试像这样对属于列表的标签进行排序:

@FetchRequest(entity: Tag.entity(), sortDescriptors:
    [NSSortDescriptor(keyPath: \Tag.name, ascending: false),],predicate: NSPredicate(format: "toListing == %@" ,  "Listing"))
    var tags : FetchedResults<Tag>
    
    

并像这样在视图中显示它:

ForEach(tags) tag in
   LazyVStack 
      Text(tag.name!)
   

核心数据设置如下: Listing Core Data printscreen Tags Core Data printscreen

【问题讨论】:

NSPredicate(format: "toListing == %@" , "listing"),为什么`“listing”`作为字符串,不应该是Listing实例吗? "toListing == %@" , "Listing" - 也不起作用。抱歉,这实际上是原始代码。 toListing 值不能是字符串。所以不能是"Listing"。这就是您找不到匹配项的原因。 好的。比我如何显示标签 foeach 列表?我正在考虑对当前列表进行排序,或者我可以直接将它们拉出来 我不使用 SwiftUI,但是当您从主视图转到列表详细视图时,您会为列表详细视图提供一个 Listing 实例,不是吗?在你的谓词中使用那个。 【参考方案1】:

根据joakim-danielson 的建议,我了解到相关实体成为该实体的属性。

我的代码现在看起来像这样:

      HStack  
      let tags = Array(arrayLiteral: fetchedData!.toTag!)
                    
                  ScrollView(.horizontal, showsIndicators: false, content:      

                        HStack(alignment: .center, spacing: 10) 
                       //  ForEach(tags, id: \.self)  tag in // same result
                            
                            ForEach(tags)  tag in
                               LazyHStack 
                                   Text(fetchedData!.toTag!.name!)
                               
                            
                        
                  )
            

奇怪的是,视图中只显示了一个标签: printscreen

【讨论】:

以上是关于CoreData关系一对一无法显示属于每个Listing的标签数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 关系与属性

无法使用 Swift 在 CoreData 中访问一对多关系

获取对象时无法访问一对多CoreData关系

如何一次将多个关系保存到 CoreData?

Swift CoreData 保存一对一的关系

如何基于另一个实体的一对多关系访问 CoreData 实体?