2014-12-01 30 views
7

Bardzo nowy w Core Data, ale przeczytałem, że mogę pobrać dane, które używa relacji Entity. Teraz, pochodząc z Mysql, może robię zbyt wiele założeń, ale mam 2 jednostki skonfigurowane z relacją między nimi i nie mogę pobrać właściwych danych.iOS 8 Swift NSFetchResult predykat z relacją Core Data nie może uzyskać dostępu do wewnętrznego identyfikatora

Oto moje 2 modele:

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

Po stworzyłem związku z technik kategorii Core Data dodania tego pola do SQLite DB:

ZCATEGORIES - INTEGER 

Powiedzmy, że chcemy się pobrać wszystkie Techniki należące do kategorii # 3 (z wewnętrznym ZID: 3)

Jeśli to zrobię:

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

Działa. Ale jeśli to zrobię:

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

To nie działa. Rozumiem, że to nie działa, ponieważ category.category jest ciągiem, a nie liczbą całkowitą.

Moje pytanie brzmi:

Czy muszę tworzyć własne pola identyfikatorów relationhip w kategorii Entity i ustawiony, wtedy odwoływać się do techniki jak:

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

?

Czy nie ma sposobu uzyskania dostępu do wewnętrznego ID kategorii, aby ta relacja zadziałała?

Albo jeszcze lepiej, wydaje mi się, że powinien istnieć wewnętrzny mechanizm do odzyskiwania tych relacji bez pisania zapytania podobnego do zapytania SQL, ale po prostu przy użyciu obiektu, coś w stylu: Techniques.categores.

Dzięki. Nigdzie nie znalazłem dobrej odpowiedzi.

+0

dół głosowania, bo to można łatwo znaleźć w każdym początkujących rdzeń samouczka dane, które obejmują relacje. Stack Overflow nie zastępuje nauki. – Fogmeister

+19

To naprawdę nieprzydatne podejście, które możesz tam zrobić, przynajmniej możesz wskazać mi link, w którym łatwo to znaleźć.Szukałem od 2 dni i nie mogę tego znaleźć, dlatego opublikowałem to tutaj. Może jestem idiotą, ale twoja odpowiedź nie robi absolutnie nic, co mogłoby przyczynić się do pomagania innym. – kakubei

+0

Pierwszy wynik Google dla "Relacji podstawowych danych" https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html Czwarty wynik dla "relacji NSFetchRequest" http: // www. raywenderlich.com/934/core-data-tutorial-for-ios-getting-started. Ten drugi link poprowadzi cię przez wszystko, co obecnie próbujesz zrobić. Nie mówię, że jesteś idiotą, mówię, że StackOverflow nie jest wymówką, by nie wychodzić i szukać odpowiedzi. – Fogmeister

Odpowiedz

7

Brakuje nazwy atrybutu, więc predykat wie, który atrybut klasy kategorii należy porównywać. W ten sposób nie będziesz musiał używać wewnętrznego niepowtarzalnego identyfikatora. Chociaż można go wyprowadzić (i zadziała), to nie jest droga do Core Data, która stara się dla ciebie zebrać te informacje.

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

Jak wspomniano, zalecane jest ustawienie relacji odwrotnej. Pozwala to Core Data zachować spójność wykresu obiektu i może być użyte do przejścia z kategorii do jej technik.

+7

Wielkie dzięki! To zadziałało, to całkiem pomocne i wyjaśnia błędne przekonanie o bazie danych, które miałem. Myślę, że niektórzy ludzie na tej stronie mogliby wiele się od ciebie nauczyć. – kakubei

1

Kiedy rozwiązałeś przyjaciela?

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

    } 
}