2017-04-08 64 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