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

kak*_*bei 7 nsfetchedresultscontroller ios swift

对核心数据很新,但我读过我可以获取使用实体关系的数据.现在,来自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
}
Run Code Online (Sandbox Code Playgroud)

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

ZCATEGORIES - INTEGER
Run Code Online (Sandbox Code Playgroud)

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

如果我这样做:

request.predicate = NSPredicate(format: "categories == %@", 3)
Run Code Online (Sandbox Code Playgroud)

有用.但如果我这样做:

request.predicate = NSPredicate(format: "categories == %@", category.category)
Run Code Online (Sandbox Code Playgroud)

它不起作用.我知道它不起作用,因为它category.category是一个String,而不是一个Integer.

我的问题是:

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

request.predicate = NSPredicate(format: "categories == %@", category.categoryID)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Con*_*nor 7

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

let categoryPredicate = NSPredicate(format: "categories.category == %@", category.category)
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢!这有用,这非常有帮助,并清除了我的数据库误解.我想这个网站上的一些人可以从你身上学到很多东西. (7认同)