Swift get specific NSManagedObject from entity (core data)

2.3k views Asked by At

I have an entity in my "ProjName.xcdatamodel" with the name "Questions". In this entity I have 5 attributes ("icehockey","volleyball","soccer",...), each with type transformable. Each row (attribute) will be filled with a NSMutableArray. What I want to do is to get the value of a specific attribute in this entity. This is my code:

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
    }
}

This will ofcourse not work since I take out the first index of the results from the database (results[0] as NSManagedObject) and thus it will crash if that element is not the same as the valueForKey I'm looking for.

How do I get the one result row that I'm looking for? I.e. "soccer", or at least can I somehow loop through the results and compare the keys of each result row so it doesn't crash when I try with the wrong key? Like something like this:

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

I hope I'm clear in my explanation!

2

There are 2 answers

0
Tejesh Alimilli On

the valueForKey method returns an optional, you can use if let as below

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

This works in Xcode 6.3.2, but looks like you are using older one. If so update to latest one.

0
Vitalii Boiarskyi On

I'm not sure I clearly understand what you are trying to achieve. But using next function(that using KVC) you can get a list of class properties and than check if the one you need is there:

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
}