如何只读取一列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存储在一个单独的实体中,并为其提供一对一的关系。这样,昂贵的数据块在被请求之前不会被加载到内存中。
您可以绝对地在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
),所以它真的取决于用例。
只是为了表明它已经存在了一段时间,这是的NSFetchRequest
下NSFetchRequestResultType
头:
@available(iOS 3.0, *)
public static var dictionaryResultType: NSFetchRequestResultType { get }
然后在那里,我可以通过 – kishor0011
列在核心数据读取的任何备选方案,列是属性,行是对象。没有对象的财产没有意义。 –
谢谢你解释我。 – kishor0011