6

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!

user2099024
  • 1,452
  • 4
  • 16
  • 26
  • Help would be really appreciated. I have searched on the internet bad havn't had any luck! – user2099024 Jun 12 '15 at 11:06
  • I think you need to add an NSPredicate to your "request". You can then filter on which data you would like to receive back from the entity. Take a look at this link for example: http://nshipster.com/nspredicate/ – Kevin Horgan Jun 16 '15 at 10:45
  • @KevinHorgan Will try when at home! – user2099024 Jun 16 '15 at 10:53
  • why are you not using a custom sub class for Questions entity? why does your entity has 5 attributes, instead of 2 i.e "sport" and "question", that way you can filter the results? any specific reasons – Tejesh Alimilli Jun 19 '15 at 11:51

2 Answers2

1

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.

Tejesh Alimilli
  • 1,782
  • 1
  • 21
  • 31
1

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
}
Vitalii Boiarskyi
  • 1,363
  • 2
  • 10
  • 25