core-data - SwiftUI 和 Core Data - 如何在谓词中使用父记录?

标签 core-data swiftui

是否可以在 SwiftUI 的 @FetchRequest 属性包装器内的谓词中使用核心数据记录?

我有一个项目列表和一个任务列表。我想点击一个项目并导航到该项目的相关任务列表。我似乎找不到在初始化 @FetcheRequest 之前以 SwiftUI 可以看到的方式传入父项目的方法。

我尝试将父项目放在 EnvironmentObject 中。当我从 ProjectListView 导航到 TaskListView 时调用它。

TaskListView()
   .environment(\.managedObjectContext, self.managedObjectContext)
   .environmentObject(self.projectToEdit)

然后在TaskListView中我添加了这个:

    @Environment(\.managedObjectContext) var managedObjectContext

    @EnvironmentObject var parentProject: Project

    @FetchRequest(
        entity: Task.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Task.name, ascending: true)
        ],
        predicate: NSPredicate(format: String(format: "%@%@", "taskProject", " == %@"), parentProject)
    ) var tasks: FetchedResults<Task>

我在谓词行中收到以下错误。

Cannot use instance member 'parentProject' within property initializer; property initializers run before 'self' is available



那么有没有办法以某种方式编写可以使用父项目的谓词?将项目传递给任务 View 似乎不会起作用。我还能如何在这样的谓词中使用记录?

最佳答案

FetchRequest 可以在 init 中动态创建。方法。这样你就可以改变谓词和排序条件。这是一些示例代码来实现这一点。

// sample Project class
class Project:NSManagedObject {
    var id : String
    var name : String
}

// sample Task class
class Task:NSManagedObject {
    var id : String
    var prjId : String
    var name : String
}

// Task List View
struct TaskListView: View {
    @Environment(\.managedObjectContext) var managedObjectContext

    private var tasksRequest: FetchRequest<Task>
    private var tasks: FetchedResults<Task> { tasksRequest.wrappedValue }

    private var project:Project

    // init Task with Project
    init(_ project:Project) {
        self.project = project

        // create FetchRequest
        self.tasksRequest = FetchRequest(
            entity: Task.entity(),
            sortDescriptors: [NSSortDescriptor(key: "name", ascending:true)],
            predicate: NSPredicate(format: "prjId == %@", project.id))
    }

    var body: some View {
        VStack {
            Section(header: Text("Tasks under \(project.name):")) {
                // access the fetched objects
                ForEach(tasks, id:\.id) { task in
                    Text("\(task.name)")
                }
            }
        }
    }
}

然后调用TaskListView()看起来像:
// call to TaskListView
TaskListView(self.projectToEdit)
    .environment(\.managedObjectContext, self.managedObjectContext)

关于core-data - SwiftUI 和 Core Data - 如何在谓词中使用父记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58643700/

相关文章:

ios - iOS/Objective-C:检测nsmanaged对象是否链接到核心数据中的另一个nsmanagedobject

swift - 从核心数据库中获取最后一条记录

core-data - Swift 3 核心数据 - 获取结果 Controller

animation - SwiftUI - 如何脉动图像不透明度?

ios - 向 TextEditor 添加水平填充,但防止它因此在内部移动滚动条

ios - 不同实体核心数据属性的最大值

ios - 与网络服务器同步核心数据

google-cloud-firestore - SwiftUI 列表会闪烁我的数据,然后使用 ObservableObject 显示一个空列表以获取 Firestore 数据

swift - 在其他数组中使用 ForEach 的索引

ios - 类型 '()' 不能符合 'View' ;只有结构/枚举/类类型可以符合协议(protocol);使用 SwiftUI 调用函数