【发布时间】:2020-11-23 17:39:06
【问题描述】:
我目前有两个具有一对多关系的 Core Data 托管对象。
目标
extension Goal {
@nonobjc public class func createFetchRequest() -> NSFetchRequest<Goal> {
return NSFetchRequest<Goal>(entityName: "Goal")
}
@NSManaged public var title: String
@NSManaged public var date: Date
@NSManaged public var progress: NSSet?
}
进展
extension Progress {
@nonobjc public class func createFetchRequest() -> NSFetchRequest<Progress> {
return NSFetchRequest<Progress>(entityName: "Progress")
}
@NSManaged public var date: Date
@NSManaged public var comment: String?
@NSManaged public var goal: Goal
}
对于每个目标,您可以有多个 Progress 对象。问题是,当我以特定的Goal 作为谓词请求获取Progress 时,没有返回任何内容。我怀疑我没有正确使用谓词。
这就是我要求他们的方式。
- 首先,我为表视图控制器获取
Goal:
var fetchedResultsController: NSFetchedResultsController<Goal>!
if fetchedResultsController == nil {
let request = Goal.createFetchRequest()
let sort = NSSortDescriptor(key: "date", ascending: false)
request.sortDescriptors = [sort]
request.fetchBatchSize = 20
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.context, sectionNameKeyPath: "title", cacheName: nil)
fetchedResultsController.delegate = self
}
fetchedResultsController.fetchRequest.predicate = goalPredicate
do {
try fetchedResultsController.performFetch()
} catch {
print("Fetch failed")
}
- 并将结果传递到下一个屏幕,
Detail视图控制器:
if let vc = storyboard?.instantiateViewController(withIdentifier: "Detail") as? DetailViewController {
vc.goal = fetchedResultsController.object(at: indexPath)
navigationController?.pushViewController(vc, animated: true)
}
- 最后,我使用
Goal作为Detail视图控制器的谓词来获取Progress:
var goal: Goal!
let progressRequest = Progress.createFetchRequest()
progressRequest.predicate = NSPredicate(format: "goal == %@", goal)
if let progress = try? self.context.fetch(progressRequest) {
print("progress: \(progress)")
if progress.count > 0 {
fetchedResult = progress[0]
print("fetchedResult: \(fetchedResult)")
}
}
Goal 已正确返回,但 Progress 没有得到任何返回。我试过了:
progressRequest.predicate = NSPredicate(format: "goal.title == %@", goal.title)
或
progressRequest.predicate = NSPredicate(format: "ANY goal == %@", goal)
但结果还是一样。
以下是我建立关系的方式:
// input for Progress from the user
let progress = Progress(context: self.context)
progress.date = Date()
progress.comment = commentTextView.text
// fetch the related Goal
var goalForProgress: Goal!
let goalRequest = Goal.createFetchRequest()
goalRequest.predicate = NSPredicate(format: "title == %@", titleLabel.text!)
if let goal = try? self.context.fetch(goalRequest) {
if goal.count > 0 {
goalForProgress = goal[0]
}
}
// establish the relationship between Goal and Progress
goalForProgress.progress.insert(progress)
// save
if self.context.hasChanges {
do {
try self.context.save()
} catch {
print("An error occurred while saving: \(error.localizedDescription)")
}
}
【问题讨论】:
-
var goal: Goal!声明了变量但没有设置 -
我正在传递上一个屏幕中的值
vc.goal = fetchedResultsController.object(at: indexPath),并将其用作谓词。 -
对不起,我的错,你在哪里运行
DetailViewController中的提取代码?而不是try?捕获错误。 -
不用担心。我在
viewDidLoad()中运行获取代码。
标签: ios swift core-data nspredicate nsmanagedobject