获取实体 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 的最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Core Data 数据库的最后一条记录?

coreData:从 NSSet 实体移动记录

当我删除核心数据实体的最后一条记录时,为啥我的应用程序崩溃了?

获取 Spring Data 上按日期排序的最后记录

如何获取mysql中最后一条之前的最后一条记录?

Coredata / SWIFT 获取有关系的记录