从 Core Data 加载 NSManagedObject 时,我可以免费获得它的孩子吗?

Posted

技术标签:

【中文标题】从 Core Data 加载 NSManagedObject 时,我可以免费获得它的孩子吗?【英文标题】:When loading an NSManagedObject from Core Data, do I get it's children for free? 【发布时间】:2018-12-04 05:00:55 【问题描述】:

我正在尝试学习如何在 Core Data 中使用这种奇特的新关系模式来模拟字符串数组。我有一个 Alarm 实体和一个 NotificationUuid 实体。 Alarm是NotificationUuid的父实体,因为一个Alarm可以有多个NotificationUuid,而一个NotificationUuid只能有一个父Alarm。我在我的 .xcdatamodeld 文件中设置了所有这些。

我的问题是:当我像这样获取父级警报对象时:

private func loadAlarms() 

    os_log("loadAlarms() called", log: OSLog.default, type: .debug)
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
            return
    
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<AlarmMO>(entityName: "Alarm")

    do 
        if self.alarms.count == 0 
            self.alarms = try managedContext.fetch(fetchRequest)
            os_log("Loading %d alarms", log: OSLog.default, type: .debug, self.alarms.count)
         else 
            os_log("Didn't need to load alarms", log: OSLog.default, type: .debug)
        
     catch let error as NSError 
        print("Could not fetch alarms. \(error), \(error.userInfo)")
    


我是否可以免费获得 AlarmMO(警报管理对象)对象的子对象 NotificationUuid 对象?还是我现在也必须为他们设置一个获取请求?这整个花哨的父/子关系如何运作,我如何从这些实体中设置/加载内容?

谢谢

我是这样定义 AlarmMO 的:

import CoreData

@objc(AlarmMO)
public class AlarmMO: NSManagedObject 

    @NSManaged public var alarmNumber: Int64
    @NSManaged public var alarmTime: NSDate?
    @NSManaged public var endTimeInterval: Double
    @NSManaged public var recurrence: Int64
    @NSManaged public var startTimeInterval: Double
    @NSManaged public var notificationUuidChildren: NSSet?




// MARK: Generated accessors for notificationUuidChildren
extension AlarmMO 

    @objc(addNotificationUuidChildrenObject:)
    @NSManaged public func addToNotificationUuidChildren(_ value: NotificationUuidMO)

    @objc(removeNotificationUuidChildrenObject:)
    @NSManaged public func removeFromNotificationUuidChildren(_ value: NotificationUuidMO)

    @objc(addNotificationUuidChildren:)
    @NSManaged public func addToNotificationUuidChildren(_ values: NSSet)

    @objc(removeNotificationUuidChildren:)
    @NSManaged public func removeFromNotificationUuidChildren(_ values: NSSet)


和 NotificationUuidMO:

import CoreData

@objc(NotificationUuid)
public class NotificationUuidMO: AlarmMO 

    @NSManaged public var notificationUuid: String
    @NSManaged public var alarmParent: AlarmMO


【问题讨论】:

【参考方案1】:

当看到您的AlarmMO 模型时,您可以获取您的AlarmMO 模型,它将在notificationUuidChildren 集合中保存NotificationUuidMO 的列表。所以不需要单独获取NotificationUuidMO

和AlarmMO 到NotificationUuidMO 是一对多的关系。所以你可以从AlarmMO得到notificationUuidChildren,从NotificationUuidMO得到alarmParent

要将NotificationUuidMO 添加到notificationUuidChildren 集,您可以使用extension AlarmMO 中给出的Core-Data 生成的访问器。

例子:

let notificationUuid = NotificationUuidMO....
let alarmMO = AlarmMO....

alarmMO.addToNotificationUuidChildren(notificationUuid)//Here your notificationUuid will be added to `notificationUuidChildren` Set and `alarmParent` of your `notificationUuid` will be automatically assigned to `alarmMO`.

【讨论】:

以上是关于从 Core Data 加载 NSManagedObject 时,我可以免费获得它的孩子吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 Core Data 中获取加载数据的具体价值?

从 Core Data 加载图像使 NavigationView 过渡变得跳跃

当用户滚动 MKMapView 时,从 Core Data 加载其他对象

将数据从 Core Data 加载到 Today Widget

UIImageView 从存储在 Core Data 中的文件路径加载

将数据从Core Data加载到Today Widget