从不同核心数据实体获取数据并将结果转换为相应类的通用方法

Posted

技术标签:

【中文标题】从不同核心数据实体获取数据并将结果转换为相应类的通用方法【英文标题】:Generic method to fetch data from different core data entities and cast result to respective classes 【发布时间】:2016-11-04 10:36:33 【问题描述】:

我正在编写一个通用方法来从给定的entityNamepredicatesortDescriptors 的核心数据实体中获取数据。我想将结果作为请求实体的数组返回。如果我给学生 entityName,我需要返回一个学生数组,如下所示,

do 
        if let results = try CoreDataController.sharedInstance.masterManagedObjectContext.fetch(request) as? [Student] 

            if results.count > 0 

                return results
            
        
    

这里的问题是,如何在使用给定实体名称的泛型方法中将结果转换为相应实体类的数组?

我试图从实体名称生成类,

let coreDataClass = NSClassFromString(entityName) as! NSManagedObject.Type

但它没有被数组声明(在上面代码中的学生位置)。请帮我找到正确的方法。

提前致谢!

【问题讨论】:

你使用的是 Swift3.0 吗? @Wolverine 是的。我正在使用 swift 3.0 和 Xcode 8.0 【参考方案1】:

您可以将 Swift 泛型用于完全相同的场景。

考虑以下 Swift(版本 3.0.1)代码,用于获取对象数组,其中谓词和排序描述符作为参数提供(您可以在 coredata 帮助器类中将此函数定义为类方法):

class func arrayOf<T: NSManagedObject>(_ entity: T.Type, 
                                       predicate: NSPredicate? = nil,
                                       sortDescriptor: [NSSortDescriptor]? = nil,
                                       context: NSManagedObjectContext = CoreDataHelper.shared.context()) -> NSMutableArray? 

    let fetchRequest = NSFetchRequest<T>(entityName: NSStringFromClass(T.self))

    if predicate != nil 
        fetchRequest.predicate = predicate!
    

    if sortDescriptor != nil 
        fetchRequest.sortDescriptors = sortDescriptor!
    

    fetchRequest.returnsObjectsAsFaults = false

    do 

        let searchResult = try context.fetch(fetchRequest)
        if searchResult.count > 0 
            // returns mutable copy of result array
            return NSMutableArray.init(array: searchResult)
         else 
            // returns nil in case no object found
            return nil
        

     catch 
        print(error.localizedDescription)
        return nil
    

希望对您有所帮助。

【讨论】:

以上是关于从不同核心数据实体获取数据并将结果转换为相应类的通用方法的主要内容,如果未能解决你的问题,请参考以下文章

从核心数据中获取名称并将其转换为大写

从同一个核心数据数据库中获取多个不同的实体

从众多实体中恢复一个获取的实体——核心数据

从核心数据创建 json 字符串,反之亦然?

核心数据:获取关系属性

应用从后台恢复时核心数据实体消失