从 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 加载图像使 NavigationView 过渡变得跳跃
当用户滚动 MKMapView 时,从 Core Data 加载其他对象
将数据从 Core Data 加载到 Today Widget