如何在一个NSFetchRequest中获取核心数据关系?

时间:2016-06-02 14:52:04

标签: ios swift core-data nsfetchrequest

我有一个核心数据应用程序,模型设置如下图所示:

Core Data Model

关系设置如下:

类别< - >>子目录< - >>项目

现在,是否可以在一次获取中从Subcategory和Item实体获取具有相同属性categoryName的对象?我认为可以通过使用关系来完成,但我正在使用的代码不起作用:

class="treeview"

3 个答案:

答案 0 :(得分:2)

为避免混淆,我建议将item重命名为items,以反映它与多对多关系。同样适用于subcategory

EDIT2 - 您要求获取具有特定Subcategory的{​​{1}}和Item个对象,对吗?您上面写的查询根本不会这样做。

首先,是的,您需要2个查询,因为您一次只能获取1个categoryName类型。

其次,让我们重新编写你的语法,因为它现在非常危险。

Entity

答案 1 :(得分:0)

如果您获取Categories,您将获得一组Category个对象。每个对象都有一个属性subcategory,它是一个包含所有相关Subcategory对象的集合。每个对象都有一个属性item,该属性包含与Item相关的所有Subcategory个对象。相关对象在CategorySubcategory对象中“嵌套”。

获取类别时,无需指定谓词来获取相关对象。一旦您访问subcategoryitem属性,系统就会自动提取这些属性。因此,例如,如果myCategory是您提取的Category个对象,

let mySubcategories = myCategory.subcategory
for subcat in mySubcategories {
    print("\(subcat)")
}

应打印每个相关的子类别。

如果这些属性为零,则可能是您尚未建立关系。这通常在您第一次创建对象时完成。例如,如果您使用Subcategory创建categoryName = "Badaue",则可以与Category建立name = "Badaue"的关系,如下所示:

let newSubcategory = ....
newSubcategory.categoryName = "Badaue"
let fetchCategory = NSFetchRequest(entityName: "Category")
fetchCategory.predicate = NSPredicate(format: "name == %@", newSubcategory.categoryName)
let categories = try! appDel.managedObjectContext.executeFetchRequest(fetchNote) as? [Category]
if (categories!.count > 0) {
    let firstCategory = categories[0]
    newSubCategory.category = firstCategory
} else {
    // no existing Category with the correct name, so create one....
    let newCategory = ....
    // ... and then establish the relationship to the Subcategory
    newSubCategory.category = newCategory
}

答案 2 :(得分:0)

应该尝试这样: 我有两个实体1.触发2.数字 关系是多对多: - 触发器可以附加一个或多个移动号码,而该号码可能是触发器表中多个触发器的一部分。

步骤:1

enter image description here

步骤:2

enter image description here

现在你会有这样的情况:

enter image description here

enter image description here

Xcode生成的代码就是这样。

import Foundation
import CoreData


extension MobileNumber {

@nonobjc public class func fetchRequest() ->  NSFetchRequest<MobileNumber> {
    return NSFetchRequest<MobileNumber>(entityName: "MobileNumber");
}

@NSManaged public var mNumber: String?
@NSManaged public var title: String?
@NSManaged public var triggers: NSSet?

}

// MARK: Generated accessors for triggers
extension MobileNumber {

@objc(addTriggersObject:)
@NSManaged public func addToTriggers(_ value: Trigger)

@objc(removeTriggersObject:)
@NSManaged public func removeFromTriggers(_ value: Trigger)

@objc(addTriggers:)
@NSManaged public func addToTriggers(_ values: NSSet)

@objc(removeTriggers:)
@NSManaged public func removeFromTriggers(_ values: NSSet)

}

同样,您也将为其他实体生成类。 我已经定义了一个使用UUID获取实体的函数,该函数对于我的Trigger表的所有行始终是唯一的。

 func fetchTriggerWithUUID(identifier: String) -> [Trigger]
  {
    let managedObjectContext =  (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Trigger")
    let predicate = NSPredicate(format: "uuid = %@", identifier)

    fetchRequest.predicate = predicate

    do {

        let results = try managedObjectContext.fetch(fetchRequest) as! [Trigger]

        return results

    } catch let error as NSError {

        print(error)

    }

    return []
}

现在,只要我需要使用任何特定[行]的数据,或者你甚至可以使用一组[行],我的情况就是这么简单。

    let result = AppDelegate.getAppDelegate().fetchTriggerWithUUID(identifier: notifIdentifier).first

        numbers.removeAll()

        for num in (result?.numbers)!
        {
            let numHere = num as! MobileNumber
            numbers.append(numHere.mNumber!)


        }

        let messageHere = "Wanted to inform you! \n" +  (result?.title)! + "\n" + (result?.desc)!

您可以在[.xcdatamodelID]文件中使用尽可能多的实体。