Swift 从实体(核心数据)获取特定的 NSManagedObject

Posted

技术标签:

【中文标题】Swift 从实体(核心数据)获取特定的 NSManagedObject【英文标题】:Swift get specific NSManagedObject from entity (core data) 【发布时间】:2015-06-12 07:56:55 【问题描述】:

我的“ProjName.xcdatamodel”中有一个名为“问题”的实体。在这个实体中,我有 5 个属性(“冰球”、“排球”、“足球”、...),每个属性的类型为 transformable。每行(属性)都将填充一个 NSMutableArray。 我想要做的是获取该实体中特定属性的值。这是我的代码:

func readQuestionsFromCore(sport:NSString) -> NSMutableArray 
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!

    var request = NSFetchRequest(entityName: "Questions")
    request.returnsObjectsAsFaults = false
    var results: NSArray = context.executeFetchRequest(request, error: nil)!
    var qArr:NSMutableArray!
    if results.count > 0 
        var res = results[0] as NSManagedObject
        qArr = res.valueForKey("\(sport)") as NSMutableArray
        return qArr
     else 
        qArr = []
        return qArr
    

这当然行不通,因为我从数据库 (results[0] as NSManagedObject) 中取出了结果的第一个索引,因此如果该元素与我正在寻找的 valueForKey 不同,它将崩溃。

如何获得我正在寻找的一个结果行? IE。 “足球”,或者至少我可以以某种方式遍历结果并比较每个结果行的键,这样当我尝试使用错误的键时它不会崩溃?像这样:

for (res) in results as NSManagedObject 
   if(res.key == "soccer") 
      qArr = res.valueForKey("soccer") as NSMutableArray
      return qArr
   

希望我的解释清楚!

【问题讨论】:

帮助将不胜感激。我在互联网上搜索了糟糕的运气! 我认为您需要将 NSPredicate 添加到您的“请求”中。然后,您可以筛选您希望从实体接收的数据。看看这个链接,例如:nshipster.com/nspredicate @KevinHorgan 会在家里试试! 你为什么不为 Questions 实体使用自定义子类?为什么您的实体有 5 个属性,而不是 2 个,即“运动”和“问题”,这样您就可以过滤结果?任何具体原因 【参考方案1】:

valueForKey 方法返回一个可选的,你可以使用if let 如下

if let questionsArr = res.valueForKey("\(sport)") as? NSMutableArray 
    return questionsArr
 else 
    return []

这适用于 Xcode 6.3.2,但看起来您使用的是旧版本。如果是,请更新到最新版本。

【讨论】:

【参考方案2】:

我不确定我是否清楚了解您要达到的目标。但是使用下一个函数(使用 KVC),您可以获得类属性列表,然后检查您需要的属性是否存在:

func getPropertyList(#classToInspect: AnyObject.Type) -> [String]

    var count : UInt32 = 0
    let properties : UnsafeMutablePointer <objc_property_t> = class_copyPropertyList(classToInspect, &count)
    var propertyNames : [String] = []
    let intCount = Int(count)
    for var i = 0; i < intCount; i++ 
        let property : objc_property_t = properties[i]
        let propertyName = NSString(UTF8String: property_getName(property))!
        propertyNames.append(propertyName as String)
    
    free(properties)
    println(propertyNames)

    return propertyNames

【讨论】:

以上是关于Swift 从实体(核心数据)获取特定的 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章

根据 Swift Core Data 中的关系获取与特定实体相关的所有条目

swift核心数据获取关系

获取核心数据中 NSManagedObject 的修改日期?

核心数据合并行为

如何从核心数据中仅获取第一个实体?

从核心数据中的实体中删除记录