使用 UUID 获取任何托管对象,无论类型如何
Posted
技术标签:
【中文标题】使用 UUID 获取任何托管对象,无论类型如何【英文标题】:Fetch any managed object with UUID, regardless of type 【发布时间】: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 - 确实。我正在尝试扁平化复杂的关系网络。 【参考方案1】:我认为你可以创建一个像BookParent
这样的父实体,它有一个属性bookUUID
,所以你可以像这样使用它NSFetchRequest<BookParent>()
,你可以找到更多细节here。
当一本书删除自己时,它应该找到任何具有属性 bookUUID 的实体,无论它们的类型如何。
根据您的描述,也许您应该建立关系并使用cascade delete?
【讨论】:
以上是关于使用 UUID 获取任何托管对象,无论类型如何的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Keycloak 获取用户 ID 和用户 UUID/GUID?
如何在 iOS 7 中使用 iBeacons 获取设备详细信息,如 UUID 或设备名称