【问题标题】:Fetch any managed object with UUID, regardless of type使用 UUID 获取任何托管对象,无论类型如何
【发布时间】: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 - 确实。我正在尝试扁平化复杂的关系网络。

标签: ios swift core-data


【解决方案1】:

我认为你可以创建一个像BookParent 这样的父实体,它有一个属性bookUUID,所以你可以像这样使用它NSFetchRequest&lt;BookParent&gt;(),你可以找到更多细节here

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2023-04-09
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多