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的标签数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章