如何只读取一列Core Data中的数据使用swift 3

问题描述:

我是CoreData中的新成员,我试图只读取一列数据。我使用下面的代码尝试:如何只读取一列Core Data中的数据使用swift 3

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

核心数据是一个对象模型。它将sql数据库的行转换为具有属性的对象。你不是直接在SQL上运行查询,所以你不能在你可以用SQL做的核心数据中做所有事情。你与和数据库交互的对象进行交互。在核心数据中,你可以有一个没有错误的对象。这意味着它的任何属性都不会被加载到内存中,但是当你需要它们时(当你访问一个属性时)它会从数据库中获取它。您不能拥有仅设置其某些属性的对象。它们要么全部设置(即故障),要么没有设置(它没有故障)。

只有取一列或两列真的没有太大的收获。额外的数据传输通常很少。唯一的例外是当你有一个庞大的数据blob作为对象的属性。在这种情况下,您应该将blob存储在一个单独的实体中,并为其提供一对一的关系。这样,昂贵的数据块在被请求之前不会被加载到内存中。

+0

然后在那里,我可以通过 – kishor0011

+0

列在核心数据读取的任何备选方案,列是属性,行是对象。没有对象的财产没有意义。 –

+0

谢谢你解释我。 – kishor0011

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

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),所以它真的取决于用例。

只是为了表明它已经存在了一段时间,这是的NSFetchRequestNSFetchRequestResultType头:

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