2017-04-08 66 views
1

我有Pet实体可以有多个活动:获取实体NSSet的最后记录?

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的最新的事件)?我每次都必须获取所有事件,还是有更快的方法来完成此操作?

+0

添加排序描述符,以便按降序排列按日期排序。如果提取限制为1,则只会得到一个对象,即具有最大日期的对象。 – matt

+0

可能重复的http://stackoverflow.com/questions/10398019/core-data-how-to-fetch-an-entity-with-max-value-property – matt

+0

所以,即使我正在抓取一个“Pet”实体我仍然可以通过'Event'添加一个排序描述符? – MarksCode

回答

1

您的实体类定义意味着您没有从事件到宠物的反向关系。你应该创建一个(有很少的情况下,你最好没有反转)。然后,您可以直接获取事件,而不是获取宠物并使用events关系。假设你的名字的反比关系“宠物”,你可以使用一个谓词是这样的:

let predicate = NSPredicate(format: "pet.dbName == %@", pet) 

您可以再申请排序描述符和取限制只返回最近的事件对于一个给定的爱称。

+0

哇我其实有相反的关系,但在代码中忘了它。谢谢! – MarksCode