使用不同表中的关系和 ID 进行 SwiftData 查询

问题描述 投票:0回答:1

我对 Swift 编程还比较陌生(大约 2 个月)。我创建了一个简单的 SwiftData 架构,由下表组成:

活动类型 活动 挑战集团 挑战

@Model
final class ActivityType: Identifiable, Hashable {
    @Attribute(.unique) var activityTypeName: String
    var activityTypeIcon: String
    @Relationship(inverse: \Activity.activityType) var activities: [Activity]
@Model
final class Activity: Identifiable, Hashable {
    @Attribute(.unique) var id: Int
    var activityName: String
    @Relationship(inverse: \ChallengeGroup.activity) var challengeGroups: [ChallengeGroup]
    var activityType: ActivityType?
@Model
final class ChallengeGroup: Identifiable, Hashable {
    
    @Attribute(.unique) var id: Int
    var challengeGroupName: String
    var category: String
    @Relationship(inverse: \Challenge.challengeGroup) var challenges: [Challenge]
    var activity: Activity?
@Model
final class Challenge: Identifiable, Hashable {
    
    @Attribute(.unique) var id: Int
    var challengeName: String
    var challengeGroup: [ChallengeGroup]

我在尝试获取特定活动的所有挑战时遇到问题。

我尝试在结构中声明:

    @Query var challenges: [Challenge]

然后在 init() 中:

  init(for activity: Activity) {        
        let id = activity.id 
        self._challenges = Query(filter: #Predicate {
            $0.challengeGroup.activity?.id == id.  <== error here
        }, sort: \.challengeName)
        
        self.activity = activity
    }

我收到错误“‘[ChallengeGroup]’类型的值没有成员‘活动’”——这是有道理的,因为 ChallengeGroup 被声明为 ChallengeGroup 数组。所以如果我尝试:

  init(for activity: Activity) {        
        let id = activity.id 
        self._challenges = Query(filter: #Predicate {
            $0.[challengeGroup].activity?.id == id.  <== error here
        }, sort: \.challengeName)
        
        self.activity = activity
    }

我现在在名称周围添加了方括号,但收到错误:预期成员名称位于“.”之后

我真的被这个问题困住了,不知道如何继续——这似乎是第 22 条军规。你能为我的问题提供一些解决方案吗?

非常感谢。

filter predicate swiftdata
1个回答
0
投票

您只能在视图内使用 Query,以便可以直接排除这种情况,并且您不应尝试在 init 内获取数据,因此此处的替代方案不相关。

categories
设置为一个空数组,稍后(在 init 之后)将对象添加到该空数组中,或者将它们作为另一个参数传递给 init

init(for activity: Activity, challenges: [Challenge]) {
    self.challenges = challenges
    self.activity = activity
    // other properties...
}

我认为 init 是用于

ChallengeGroup
,问题没有说明任何内容,但它是唯一适合的类型

然后我们还有一些其他问题

  • 您不必设置所有属性,这必须在 init 中完成,除非它们是可选的或已设置默认值。所以
    challengeGroupName
    category
    需要设置为
  • 您不应该将
    id
    属性设置为另一个对象类型的 id,特别是当您声明它是唯一的时,因为这样您在运行时会收到错误,因为这里有一对多关系。我建议您删除
    all
    模型的 id 属性,因为
    @Model
    宏会自动为您添加一个。
© www.soinside.com 2019 - 2024. All rights reserved.