获取实体 NSSet 的最后一条记录?
Posted
技术标签:
【中文标题】获取实体 NSSet 的最后一条记录?【英文标题】:Fetch last record of Entities NSSet? 【发布时间】:2017-04-08 04:01:21 【问题描述】:我有 Pet
可以有多个事件的实体:
public class Pet: NSManagedObject
@NSManaged var dbName: String
@NSManaged var events: NSSet? // 1-to-many relationship with events
public class Event: NSManagedObject
@NSManaged var key: String
@NSManaged var date: Int64
我已将事件设置为根据其日期编制索引。我创建了一个函数,可以返回给定宠物的所有事件。
func fetchEventsForPet(pet: String) -> [Event]?
let request = NSFetchRequest<NSFetchRequestResult>(entityName: Pet.entityName)
let predicate = NSPredicate(format: "dbName == %@", pet)
request.predicate = predicate
request.fetchLimit = 1
do
let result = try self.fetch(request) as? [Pet]
if let pets = result
for pet in pets
if let events = pet.events
if let evts = events.allObjects as? [Event]
return evts // Return pets events
catch
return nil
如何修改此函数以仅返回最后一个事件(基于date
的最新事件)?我必须每次都获取所有事件还是有更快的方法来做到这一点?
【问题讨论】:
添加一个排序描述符,以便获取按日期降序排序。如果提取限制为 1,您将只获得一个对象,即具有最大日期的对象。 可能与***.com/questions/10398019/…重复 所以即使我正在获取Pet
实体,我仍然可以将排序描述符添加到它与Event
的关系中?
【参考方案1】:
您的实体类定义暗示您没有从 Event 到 Pet 的反向关系。您应该创建一个(在非常非常少的情况下,您会在没有逆向的情况下变得更好)。然后,您可以直接获取事件,而不是获取 Pets 并使用 events
关系。假设您将反向关系命名为“宠物”,您将使用如下谓词:
let predicate = NSPredicate(format: "pet.dbName == %@", pet)
然后,您可以应用排序描述符和获取限制以仅返回给定宠物名称的最新事件。
【讨论】:
哇,我确实有相反的关系,但在代码中忘记了它。谢谢!以上是关于获取实体 NSSet 的最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章