我是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”是我的专栏,我只想获取该列的数据。
答案 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
)所以它实际上取决于用例。
只是为了表明它已存在一段时间,这位于NSFetchRequest
下NSFetchRequestResultType
的标题中:
@available(iOS 3.0, *)
public static var dictionaryResultType: NSFetchRequestResultType { get }