Swift get specific NSManagedObject from entity (core data)
Asked Answered
S

2

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!

Smukler answered 12/6, 2015 at 7:56 Comment(4)
Help would be really appreciated. I have searched on the internet bad havn't had any luck!Smukler
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: nshipster.com/nspredicateFerguson
@KevinHorgan Will try when at home!Smukler
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 reasonsLashio
L
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.

Lashio answered 19/6, 2015 at 11:46 Comment(0)
S
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
}
Soursop answered 20/6, 2015 at 2:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.