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

时间:2017-08-14 13:02:29

标签: database core-data swift3 row

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

//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”是我的专栏,我只想获取该列的数据。

2 个答案:

答案 0 :(得分:3)

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

在大多数情况下,仅通过获取一列或两列来获得很多东西。额外的数据传输通常很少。唯一的例外是当您有大量数据和对象属性时。在这种情况下,您应该将blob存储在单独的实体上并为其提供一对一的关系。这样,在请求之前,昂贵的数据块不会被加载到内存中。

答案 1 :(得分:2)

您绝对可以在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"
   }
]

问题不是关于性能提升(即使可能存在;我真的不知道!)而是如果/如何做到这一点,这就是它的完成方式。另外,我不同意其他声明,即如果没有物品,那么它就没有意义。&#34;在很多情况下,您需要分配对象,其中您需要的是一个或两个属性。如果您在多个商店之间松散地耦合实体,这也会派上用场。当然还有其他方法(你的xcdatamodel&#39; s Fetched Properties)所以它实际上取决于用例。

只是为了表明它已存在一段时间,这位于NSFetchRequestNSFetchRequestResultType的标题中:

@available(iOS 3.0, *)
public static var dictionaryResultType: NSFetchRequestResultType { get }