具有Core Data关系的iOS 8 Swift NSFetchResult谓词无法访问内部ID

时间:2014-12-01 16:47:40

标签: ios swift nsfetchedresultscontroller

核心数据非常新,但我读过我可以获取使用实体关系的数据。现在,来自Mysql可能我做了太多的假设,但我有2个实体设置了它们之间的关系,我无法获取正确的数据。

以下是我的2个型号:

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

在创建从技术到类别的关系后,Core Data将此字段添加到Sqlite DB:

ZCATEGORIES - INTEGER

假设我想要获取属于类别#3的所有技术(内部ZID:3)

如果我这样做:

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

有效。但如果我这样做:

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

它不起作用。我知道它不起作用,因为category.category是一个字符串,而不是一个整数。

我的问题是:

我是否必须在类别实体中创建自己的关系ID字段并设置它,然后引用技术,如:

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

是否有办法访问类别的内部ID以使此关系起作用?

或者更好的是,在我看来应该有一个内部机制来检索这些关系,而无需编写类似SQL的查询,只需使用Object,例如:Techniques.categores

感谢。我在任何地方都找不到好的答案。

2 个答案:

答案 0 :(得分:7)

您缺少属性名称,因此谓词知道要比较的类别类的哪个属性。这样您就不需要使用内部唯一ID。虽然它可以衍生出来(并且会起作用),但它并不是采用Core Data的方式,而Core Data正试图为您提取这些信息。

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

如上所述,建议建立反比关系。它允许Core Data维护对象图的一致性,并可用于从类别到其技术。

答案 1 :(得分:1)

你解决了朋友?

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

    }
}