我有一个核心数据应用程序,模型设置如下图所示:
关系设置如下:
类别< - >>子目录< - >>项目
现在,是否可以在一次获取中从Subcategory和Item实体获取具有相同属性categoryName的对象?我认为可以通过使用关系来完成,但我正在使用的代码不起作用:
class="treeview"
答案 0 :(得分:2)
为避免混淆,我建议将item
重命名为items
,以反映它与多对多关系。同样适用于subcategory
。
EDIT2 - 您要求获取具有特定Subcategory
的{{1}}和Item
个对象,对吗?您上面写的查询根本不会这样做。
首先,是的,您需要2个查询,因为您一次只能获取1个categoryName
类型。
其次,让我们重新编写你的语法,因为它现在非常危险。
Entity
答案 1 :(得分:0)
如果您获取Categories
,您将获得一组Category
个对象。每个对象都有一个属性subcategory
,它是一个包含所有相关Subcategory
对象的集合。每个对象都有一个属性item
,该属性包含与Item
相关的所有Subcategory
个对象。相关对象在Category
和Subcategory
对象中“嵌套”。
获取类别时,无需指定谓词来获取相关对象。一旦您访问subcategory
或item
属性,系统就会自动提取这些属性。因此,例如,如果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
步骤:2
现在你会有这样的情况:
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]文件中使用尽可能多的实体。