2014-12-01 13 views
7

Molto nuovo per i dati di base, ma ho letto che posso recuperare i dati che utilizzano le relazioni di entità. Ora, venendo da Mysql forse sto facendo troppe ipotesi, ma ho 2 entità impostate con una relazione tra loro e non riesco a recuperare i dati corretti.iOS 8 Il predicato Swift NSFetchResult con relazione Core Data non può accedere all'ID interno

Qui ci sono i miei 2 modelli:

@objc(Categories) 
class Categories: NSManagedObject { 
    @NSManaged var category: String 
    @NSManaged var exp: String 
    @NSManaged var order: NSNumber 
} 

@objc(Techniques) 
class Techniques: NSManagedObject { 
    @NSManaged var korean: String 
    @NSManaged var order: NSNumber 
    @NSManaged var spanish: String 
    @NSManaged var categories: Categories 
} 

Dopo che ho creato un rapporto da Tecniche per le categorie, Core Data ha aggiunto questo campo per lo Sqlite DB:

ZCATEGORIES - INTEGER 

Diciamo che voglio prendere tutte le tecniche che appartengono alla categoria # 3 (con ZID interno: 3)

Se si esegue questa operazione:

request.predicate = NSPredicate(format: "categories == %@", 3) 

Funziona. Ma se lo faccio:

request.predicate = NSPredicate(format: "categories == %@", category.category) 

Non funziona. Capisco che non funzioni perché category.category è una stringa, non un numero intero.

La mia domanda è:

Devo creare il mio campo ID relationhip nella Categoria entità e impostare che, quindi fare riferimento alla tecnica come:

request.predicate = NSPredicate(format: "categories == %@", category.categoryID) 

?

Non c'è un modo per accedere all'ID interno della categoria per far funzionare questa relazione?

O meglio ancora, sembrerebbe a me che ci dovrebbe essere un mechanish interna per recuperare queste relazioni senza scrivere una query SQL-like, ma semplicemente utilizzando l'oggetto, qualcosa di simile a: Techniques.categores.

Grazie. Non ho trovato una buona risposta da nessuna parte.

+0

Giù voto perché questo può essere facilmente trovato in qualsiasi principianti nucleo dati del tutorial che coprono le relazioni. Stack Overflow non è un sostituto per l'apprendimento. – Fogmeister

+19

Questo è un atteggiamento davvero inutile che hai lì, il minimo che potresti fare è indicarmi un link dove è facile trovarlo.Ho cercato per 2 giorni e non riesco a trovarlo per questo ho postato questo qui. Forse sono un idiota, ma la tua risposta non fa assolutamente nulla per favorire la causa dell'aiuto di altri. – kakubei

+0

Primo risultato di Google per "relazione Core Data" https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html Quarto risultato per "relazione NSFetchRequest" http: // www. raywenderlich.com/934/core-data-tutorial-for-ios-getting-started. Questo secondo link ti parlerà di tutto ciò che stai attualmente cercando di fare. Non sto dicendo che sei un idiota, sto dicendo che StackOverflow non è una scusa per non uscire e cercare risposte. – Fogmeister

risposta

7

Manca un nome di attributo, quindi il predicato conosce quale attributo della classe di categoria confrontare. In questo modo non sarà necessario utilizzare l'ID univoco interno. Anche se può essere derivato (e funzionerebbe) non è il modo di andare con Core Data, che sta cercando di astrarre le informazioni per te.

let categoryPredicate = NSPredicate(format: "categories.category == %@", category.category) 

Come indicato, è consigliabile una relazione inversa. Permette ai Core Data di mantenere la consistenza del grafo degli oggetti e può essere usato per passare da una categoria alle sue tecniche.

+7

Grazie mille! Ha funzionato, è molto utile e chiarisce il malinteso che avevo del database. Penso che alcune persone su questo sito possano imparare molto da te. – kakubei

1

Come hai risolto amico?

enter image description here

enter image description here

import UIKit 
import CoreData 


let appdelegado:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let contexto2:NSManagedObjectContext = appdelegado.managedObjectContext 


class Consultar: UIViewController { 

    let marca = Marca() 
    let modelo = Modelo() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     //Consultando con diferente contextp 

     let entityMarca = NSEntityDescription.entityForName("Modelo", inManagedObjectContext: contexto2) 

     let oderBy = NSSortDescriptor(key: "nombre", ascending: true) 
     let consulta = NSFetchRequest(entityName: "Modelo") 
     consulta.sortDescriptors = [oderBy] 
     //???¿¿???¿¿???¿ HELP 
     let predicate = NSPredicate(format: "modelo.marca = %@",) 
     consulta.entity = entityMarca 
     consulta.predicate = predicate 
     //let arrayResultado:[NSArray] = try!contexto.executeFetchRequest(consulta) as! [NSArray] 
     //if let resultado = try?contexto.executeFetchRequest(consulta) where resultado.count > 0{ 
     if let arrayResultado:[NSArray] = try!contexto.executeFetchRequest(consulta) as! [NSArray] where arrayResultado.count > 0{ 
      for x in arrayResultado { 
       print("\n ====================DATOS RECUPERADOS======================") 
       print(x) 
//    print(x.valueForKey("nombre")!) 
//    print(x.valueForKey("marca")!) 
      } 

     }else{ 
      print("Sin modelos") 
     } 

    } 
} 
Problemi correlati