如何使用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 的 Core Data 获取非标准(可转换)属性来更新/保存和持久化?
Swift之深入解析如何结合Core Data和SwiftUI