使用 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&lt;BookParent&gt;(),你可以找到更多细节here。

当一本书删除自己时,它应该找到任何具有属性 bookUUID 的实体,无论它们的类型如何。

根据您的描述,也许您应该建立关系并使用cascade delete?

【讨论】:

以上是关于使用 UUID 获取任何托管对象,无论类型如何的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Keycloak 获取用户 ID 和用户 UUID/GUID?

如何从 JSON 对象中获取特定的键值

如何在 iOS 7 中使用 iBeacons 获取设备详细信息,如 UUID 或设备名称

如何在托管的 MVC 应用程序中获取 Azure AD 对象 ID?

如何在运行时获取构建 UUID 和镜像基地址

如何提高 iPhone 上的核心数据获取性能?