【问题标题】:How to fetch only one column Data in Core Data using swift 3如何使用swift 3仅获取Core Data中的一列数据
【发布时间】: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”是我的一列,我只想获取该列的数据。

【问题讨论】:

    标签: database core-data swift3 row


    【解决方案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:看起来这是对您问题的完整回答。请问你会考虑接受吗?
      • stackoverflow.com/questions/50231512/… 请帮我解答这个问题。
      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多