【发布时间】:2021-12-26 09:13:13
【问题描述】:
更新:我相信这是重复的:Core Data - Fetch all entities using the same field
我想使用 UUID 来查找所有具有此 ID 属性的托管对象,无论类型如何。
在典型情况下,我会在实体本身上使用获取请求。例如,在书店中,我可以使用Book 上的获取请求找到bookUUID 的书。
class BookShelf: NSManagedObject {
@NSManaged var bookUUID: UUID!
func fetchBook() -> Book? {
let request = Book.fetchRequest()
request.sortDescriptors = []
request.predicate = NSPredicate(format: "%K == %@", "bookUUID", bookUUID as CVarArg)
return try? self.managedObjectContext?.fetch(request).first
}
}
这很有效,因为BookShelf 知道Book。但是反过来呢?当一本书删除自己时,它应该找到任何具有属性bookUUID 的实体,无论它们的类型如何。
可以这样表达,但是这行不通。没有通用的NSManagedObject 实体。
extension NSManagedObjectContext {
func findAllObjectsUsingThisBook(bookUUID: UUID) -> Array<NSManagedObject>? {
let request = NSFetchRequest<NSManagedObject>()
request.predicate = NSPredicate(format: "%K == %Q", "bookUUID", uuid as CVarArg)
request.sortDescriptors = []
return try? self.fetch(request)
}
}
通俗地说,这可用于查找具有特定属性的任何对象。
extension NSManagedObjectContext {
func findAllObjectsWithProperty<T>(named propertyName: String, andValue value: T) -> Array<NSManagedObject>? where T: CVarArg {
let request = NSFetchRequest<NSManagedObject>()
request.predicate = NSPredicate(format: "%K == %Q", propertyName, value)
request.sortDescriptors = []
return try? self.fetch(request)
}
}
我怎样才能做到这一点?
【问题讨论】:
-
不能,需要分别搜索每个实体。你当然可以编写一个通用函数,然后为每个实体循环调用它
-
如果我正确理解您的问题,您可以使用子类化来做到这一点。但是,如果需要,您可能需要“事后转换”以获得正确的子类。
-
其实这就是Relationship的目的。这本书是在一个实体中创建的,并且可以通过关系连接到其他实体。如果您删除这本书,它也会在相关实体中被删除(取决于设置)。
-
@Larme - 正确。在我的特定用例中,我将只删除对象而不检查它们的类型。
-
@vadian - 确实。我正在尝试扁平化复杂的关系网络。