簡體   English   中英

CoreData Fetch:獲取具有最大一個屬性並具有另一個共同屬性的對象

[英]CoreData Fetch: Getting the objects with the maximum of one atttribute and having another attribute in common

我有一個 CoreData ManagedObject 類型的事件,其屬性名稱:Sting 和日期:Date。

我想獲取名稱中包含過濾器的所有 EventObject。 如果多個同名 object 匹配過濾器,則只返回最新日期的 object。

只是為了澄清我想要什么。 在基於表的方法中,我會在 SQL 中查詢,例如:

SELECT name, max(date) FROM Event
WHERE name contains 'filter'
GROUP BY name  

在 CoreData 我試過這樣,但得到:
無法將 'NSKnownKeysDictionary1' 類型的值轉換為 'xx12.Event'

let fetchRequest : NSFetchRequest<Event> = Event.fetchRequest(    fetchRequest.predicate = NSPredicate (format: "name contains %@", filter)
fetchRequest.sortDescriptors = [NSSortDescriptor (key: "name", ascending: true)]
   
// We want Event not Dictionary back 
// fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType
      
let keypathExpression = NSExpression(forKeyPath: "date")
let maxExpression = NSExpression(forFunction: "max:", arguments: [keypathExpression])

let key = "maxDate"   
let expressionDescription = NSExpressionDescription()
expressionDescription.name = key
expressionDescription.expression = maxExpression
expressionDescription.expressionResultType = .dateAttributeType

fetchRequest.propertiesToFetch = [expressionDescription]
      
let resultEvents = try moc.fetch(fetchRequest)

例子:
如果我有這些物品

meeting1, 1.1.2020
meeting1, 1.4.2020
meeting2, 1.1.2020
meeting2, 1.4.2020
party, 2.3.2020

和過濾器:會議
我想獲取對象:

meeting1, 1.4.2020
meeting2, 1.4.2020

我將使用基本的獲取請求,然后在 swift 代碼中進行分組部分,而不是使用 NSExpression

let fetchRequest : NSFetchRequest<Event> = Event.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name contains %@", filter)

let result = try moc.fetch(fetchRequest)

return Dictionary(grouping: result, by: \.name).values
    .compactMap { $0.max {$0.date < $1.date } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM