gpt4 book ai didi

ios - CoreData 一对多关系与值比较

转载 作者:行者123 更新时间:2023-11-30 12:09:57 24 4
gpt4 key购买 nike

我有两个实体:

议程事件

议程日期

AgendaDates 与 AgendaEvents 具有一对多关系。

我正在尝试存储在临时数组中(var myTempEvents = [AgendaEvent] ())所有在 AgendaDates 内具有等于定义日期的日期的 AgendaEvents(让 myDate = Date() )

到目前为止我有这个:

 var myEventDate = [String]()
var myTempEvents = [AgendaEvent]()
var myEvents = [AgendaEvent]()
var myDate = Date()

func getEventDates() {
for event in myEvents {
for date in (event.agendaDates as? Set<AgendaDate>)! {
let eventDates = date.agendaDates
eventDate = eventDates
formatter.dateFormat = "dd MM yyyy"
let eventDateString = formatter.string(from: eventDate)
myEventDate.append(eventDateString)

}
}
}

我现在需要做的是检查 AgendaEvents 的日期是否等于 myDate,如果是,我需要将该事件添加到 myTempEvents。

这应该发生在这个函数内:

func configureCell(cell: CalendarAgendaCell, indexPath: IndexPath) {
for dates in calendar.selectedDates {
for dateOfEvent in myEventDate {
formatter.dateFormat = "dd MM yyyy"
let dateToCompare = formatter.string(from: dates)
if dateOfEvent == dateToCompare {
let myEvent = myTempEvents[indexPath.row]
cell.configureCell(agendaEvent: myEvent)

} else {
//empty the tempArray

}
}
}
}

这个函数由 tableView 的 cellForRowAt 函数调用:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Dequeue Cell
let cell = tableView.dequeueReusableCell(withIdentifier: "AgendaCell", for: indexPath) as! AgendaCell
//Fetch model object to display
configureCell(cell: cell, indexPath: indexPath)
return cell
}

我不太擅长核心数据(仍在学习),因此我们将不胜感激。

谢谢!

更新---------2017年9月14日

正如 @Simo 善意建议的那样,我已经编辑了我的代码,如下所示:

    func agendaEventsWithDate(date: Date) -> NSFetchRequest<NSFetchRequestResult>
{
// create a fetch request that will retrieve all the AgendaEvents.
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AgendaEvent")

// set the predicate to only keep AgendaEvents where the related AgendaDate's date matches the passed in date.
fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.agendaDates == %@", date as CVarArg)

return fetchRequest
}

let myTempEvents = try?context.fetch(agendaEventsWithDate(date: Date()))

上下文是:

let ad = UIApplication.shared.delegate as! AppDelegate

let context = ad.persistentContainer.viewContext

但是我收到此错误:

“fetch”的使用不明确

谢谢!

最佳答案

有一种更简单的方法可以实现这一点,而无需自己进行比较。您应该阅读有关使用带有谓词的 NSFetchRequest 的内容。

您可以获取存储在 Core Data 中的所有 AgendaEvent,然后对其进行过滤,以便仅留下包含与您指定的日期匹配的 AgendaDate 的事件。

获取请求(包含在一个很好的提供程序函数中)可能看起来像这样:

func agendaEventsWithDate(date: Date) -> NSFetchRequest
{
// create a fetch request that will retrieve all the AgendaEvents.
let fetchRequest = NSFetchRequest(entityName: "AgendaEvent")

// set the predicate to only keep AgendaEvents where the related AgendaDate's date matches the passed in date.
fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.date == %@", date)

return fetchRequest
}

这显然假设您的 AgendaEvent 实体与 AgendaDate 的关系称为 agendaDates 并且您的 AgendaDate 实体有一个名为date的属性。

然后,当您执行获取请求时,您将返回您正在查找的项目的数组。无需您正在进行的所有手动比较。

let myTempEvents = try? managedObjectContext?.executeFetchRequest(self.agendaEventsWithDate(someDate))

关于ios - CoreData 一对多关系与值比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46200780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com