核心数据非常新,但我读过我可以获取使用实体关系的数据。现在,来自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
。
感谢。我在任何地方都找不到好的答案。
答案 0 :(得分:7)
您缺少属性名称,因此谓词知道要比较的类别类的哪个属性。这样您就不需要使用内部唯一ID。虽然它可以衍生出来(并且会起作用),但它并不是采用Core Data的方式,而Core Data正试图为您提取这些信息。
let categoryPredicate = NSPredicate(format: "categories.category == %@", category.category)
如上所述,建议建立反比关系。它允许Core Data维护对象图的一致性,并可用于从类别到其技术。
答案 1 :(得分:1)
你解决了朋友?
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")
}
}
}