如何使用swift 3仅获取Core Data中的一列数据

Posted

技术标签:

【中文标题】如何使用swift 3仅获取Core Data中的一列数据【英文标题】:How to fetch only one column Data in Core Data using swift 3 【发布时间】:2017-08-14 13:02:28 【问题描述】:

我是 CoreData 的新手,我试图只获取一列数据。我正在尝试使用以下代码:

//MARK :- Fetch All Calculation
func fetchUniqueParentAxis(testID : String) -> [String]  

    var arrAxis : [String] = []

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "TesCalculation")
    fetchRequest.predicate = NSPredicate(format: "testID == %@ ",testID)
    fetchRequest.includesPropertyValues = true
    fetchRequest.returnsObjectsAsFaults = false
    fetchRequest.propertiesToFetch = ["parentAxis"]

    do 
         calculation = try AppDelegate.getContext().fetch(fetchRequest) as! [TesCalculation]//try AppDelegate.getContext().fetch(fetchRequest) as! [String : AnyObject]
    

    catch let error 
        //Handle Error
        Helper.sharedInstance.Print(error as AnyObject)
    
 . 

“parentAxis”是我的一列,我只想获取该列的数据。

【问题讨论】:

【参考方案1】:

您绝对可以在 CoreData 中获取列的子集。是的,我同意 Core Data IS 是一种对象图解决方案,可以使用 SQLite 作为存储引擎。然而,在 CoreData 中获取数据子集而不是整个 NSManagedObject 已经有很长时间了,但最近的更改使其与以前略有不同

let fetchRequest = NSFetchRequest<NSDictionary>(entityName: TesCalculation.entity().name!)
fetchRequest.resultType = .dictionaryResultType
fetchRequest.predicate = NSPredicate(format: "testID == %@ ",testID)
fetchRequest.propertiesToFetch = ["parentAxis"]
do 
    let results = try AppDelegate.getContext().fetch(fetchRequest)
 catch let error as NSError 
    print(error)

这将为您返回如下所示的内容:

[
   
      "parentAxis": "abc"
   ,
   
      "parentAxis": "xyz"
   
]

问题不在于性能提升(即使可能有;我真的不知道!),而是是否/如何做到这一点,这就是如何做到的。另外,我不同意其他说法,即“拥有没有对象的属性是没有意义的”。在很多情况下,您分配对象时只需要一两个属性即可。如果您在多个商店之间松散耦合实体,这也会派上用场。当然还有其他方法可以解决这个问题(你的 xcdatamodel 的 Fetched Properties),所以它真的取决于用例。

只是为了表明它已经存在了一段时间,这是在 NSFetchRequestResultType 下的 NSFetchRequest 的标题中:

@available(ios 3.0, *)
public static var dictionaryResultType: NSFetchRequestResultType  get 

【讨论】:

【参考方案2】:

核心数据是一个对象模型。它将 sql 数据库的行转换为具有属性的对象。您没有直接在 SQL 上运行查询,因此您无法在核心数据中执行您可以使用 SQL 执行的所有操作。您与与数据库交互的对象交互。在核心数据中,您可以拥有一个没有故障的对象。这意味着它的所有属性都没有加载到内存中,但是当您需要它们时(当您访问属性时),它会从数据库中获取它。您不能拥有仅设置了部分属性的对象。它们要么全部设置(即有故障),要么没有设置(它没有故障)。

在大多数情况下,仅获取一两列确实没有什么好处。额外的数据传输通常是最小的。唯一的例外是当您有大量数据作为对象的属性时。在这种情况下,您应该将 blob 存储在一个单独的实体上并赋予它一对一的关系。这样,昂贵的数据块在被请求之前不会加载到内存中。

【讨论】:

那么有没有可以按列获取的替代方法 在core-data中,一列是一个属性,一行是一个对象。没有对象的属性是没有意义的。 谢谢你的解释。 @kishor0011:看起来这是对您问题的完整回答。请问你会考虑接受吗? ***.com/questions/50231512/… 请帮我解答这个问题。

以上是关于如何使用swift 3仅获取Core Data中的一列数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?

Swift 3 Core Data - 获取结果控制器

如何使用带有 Swift 的 Core Data 获取非标准(可转换)属性来更新/保存和持久化?

Swift之深入解析如何结合Core Data和SwiftUI

如何在 Swift 中的 Core Data 中保存多个项目

根据 Swift Core Data 中的关系获取与特定实体相关的所有条目