具有核心数据关系的 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的主要内容,如果未能解决你的问题,请参考以下文章