6

Ho un'entità nel mio "ProjName.xcdatamodel" con il nome "Domande". In questa entità ho 5 attributi ("icehockey", "pallavolo", "calcio", ...), ciascuno con il tipo transformable. Ogni riga (attributo) sarà riempita con un NSMutableArray. Quello che voglio fare è ottenere il valore di un attributo specifico in questa entità. Questo è il mio codice:Swift ottiene specifici NSManagedObject dall'entità (dati di base)

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

Questo non naturalmente funzionerà da quando prendo il primo indice dei risultati dal database (results[0] as NSManagedObject) e quindi andrà in crash se questo elemento non è la stessa come il valueForKey I' sto cercando.

Come ottengo la riga di un risultato che sto cercando? Cioè "soccer", o almeno posso in qualche modo scorrere i risultati e confrontare le chiavi di ogni riga del risultato in modo che non si arresti quando provo con la chiave sbagliata? Tipo qualcosa:

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

Spero di essere chiaro nella mia spiegazione!

+0

L'aiuto sarebbe molto apprezzato. Ho cercato su internet male non ha avuto fortuna! – user2099024

+0

Penso che sia necessario aggiungere un NSPredicate alla "richiesta". È quindi possibile filtrare i dati che si desidera ricevere dall'entità. Dai un'occhiata a questo link per esempio: http://nshipster.com/nspredicate/ –

+0

@KevinHorgan Proverà quando a casa! – user2099024

risposta

1

il metodo restituisce un valueForKey opzionale, è possibile utilizzare if let come di seguito

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

Questo funziona in Xcode 6.3.2, ma sembra che si sta utilizzando più vecchia. Se così si aggiorna all'ultimo uno.

1

Non sono sicuro di capire chiaramente cosa stai cercando di ottenere. Ma usando la funzione successiva (quella che usa KVC) puoi ottenere un elenco di proprietà di classe e controllare se quello che ti serve è lì:

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 
}