我有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
的最新事件)?我是否每次都要获取所有事件,或者有更快的方法来执行此操作?
答案 0 :(得分:1)
您的实体类定义意味着您没有从Event到Pet的反向关系。你应该创建一个(很少有这样的场合你没有逆转就会更好)。然后,您可以直接获取事件,而不是获取Pets并使用events
关系。假设您将反向关系命名为“pet”,您将使用如下谓词:
let predicate = NSPredicate(format: "pet.dbName == %@", pet)
然后,您可以应用排序描述符和获取限制,以仅返回给定宠物名称的最新事件。