具有核心数据关系的 iOS 8 Swift NSFetchResult 谓词无法访问内部 ID

Posted

技术标签:

【中文标题】具有核心数据关系的 iOS 8 Swift NSFetchResult 谓词无法访问内部 ID【英文标题】:iOS 8 Swift NSFetchResult predicate with Core Data relationship can't access internal ID 【发布时间】:2014-12-01 16:47:39 【问题描述】:

Core Data 非常新,但我读到我可以获取使用实体关系的数据。现在,来自 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 的查询,而只需使用对象,例如:Techniques.categores

谢谢。我在任何地方都没有找到好的答案。

【问题讨论】:

你的态度真的很无益,至少你能做的就是把我指向一个很容易找到的链接。我已经搜索了 2 天,但似乎无法找到它,这就是我在此处发布此内容的原因。也许我是个白痴,但你的回应绝对不会促进帮助他人的 SO 事业。 “核心数据关系”developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 的第一个 Google 结果@“NSFetchRequest 关系”raywenderlich.com/934/… 的第四个结果。第二个链接将告诉您当前正在尝试做的所有事情。我不是说你是个白痴,我是说 *** 不是不出去研究答案的借口。 我想你可能不明白这个问题,因为在这两个链接中都没有谈到获取关系数据。此外,它们都在objective-c中,而问题的标题清楚地表明了Swift。如果它们是有用的链接,我可以尝试解析信息,但它们不是。我猜你的初衷是对的,最好不要投票并保持沉默,至少不会浪费我的时间。 Objective-C,Swift,真的没关系。您正在访问同一组 API。语法可能略有不同,但方法完全相同。第二个链接,四分之一的方法是在 FailedBankInfo 和 FailedBankDetails 之间建立关系。首先,你没有反向关系。如果你确实有(它在链接中解释)这意味着你可以访问category.technique 或其他任何东西。其次,我如何能够在不求助于 SO 的情况下找到这些信息? 【参考方案1】:

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

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

如前所述,建议建立反向关系。它允许 Core Data 保持对象图的一致性,并且可以用来从一个类别转到它的技术。

【讨论】:

非常感谢!那行得通,这很有帮助,并且消除了我对数据库的误解。我认为这个网站上的一些人可以从你身上学到很多东西。【参考方案2】:

当你解决了朋友?

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

    

【讨论】:

以上是关于具有核心数据关系的 iOS 8 Swift NSFetchResult 谓词无法访问内部 ID的主要内容,如果未能解决你的问题,请参考以下文章

iOS核心数据“加入”两个“表”

如何为对象计数多个关系创建谓词?核心数据 iOS Swift

iOS 8 Swift - 保存多个实体的数据

swift2核心数据和处理关系

如何在 IOS Swift 中获取核心数据中的多对多关系?

IOS - 如何在 Core Data Swift 中将数据插入到具有关系的不同表中