如何使用检索到的核心数据对象

Posted

技术标签:

【中文标题】如何使用检索到的核心数据对象【英文标题】:How to work with retrieved Core Data Objects 【发布时间】:2020-07-11 22:17:09 【问题描述】:

当我使用 DataCore 存储数据时,有几个限制使我将大量检索到的对象转换为常规类对象,以便我可以定期处理数据。问题是这种行为会产生一些平庸的代码行。

我面临的限制是:

A.缺乏使用 Init() 使用构造函数创建对象的能力

B. 对属性的限制,特别是在属性更改时使用 didSet。

例如,您不能在此类中使用 didSet 或创建构造函数:

   extension Time 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Time> 
        return NSFetchRequest<Time>(entityName: "Time")
    

    @NSManaged public var hours: Int
    @NSManaged public var minutes: Int
    

我应该如何克服这两个限制?

2.另外,到目前为止,我使用这种代码创建了一个 DataCore 实体对象:

let timeEntity = NSEntityDescription.entity(forEntityName: "Time", in: managedContext)!
    

let time = NSManagedObject(entity: timeEntity, insertInto: managedContext)
   time.setValue(10, forKeyPath: "hours")
   time.setValue(20, forKeyPath: "minutes")

这是在 Core Data 中创建实体的适当方式吗?

【问题讨论】:

【参考方案1】:

首先回答你的第二个问题,不。 TimeNSManagedObject 的子类。你可以使用

let time = Time(context:managedContext)

然后您可以访问您的time 实例的属性:

time.hours = 10
time.minutes = 20

要回答您的第二个问题,我会质疑这是否有必要;也许您可以解释一下您要做什么。

您可以使用包含hourminute 的计算属性来实现您正在寻找的相同目标。

【讨论】:

谢谢。我确实将代码生成设置为手动,这是它创建的我可以编辑的代码,也许这毕竟不是“手动”方式?您将如何将 didSet 与这些属性一起使用?我试过并得到“@NSManaged not allowed on observing properties”。使用计算属性时,我得到类似的结果:“@NSManaged not allowed on computed properties”。我希望能以我可以使用 didSet 或计算属性的方式提供基于这些属性的代码示例。 您不能创建计算属性@NSManaged,但您可以使用计算属性来获取/设置实际属性。你能解释一下你想做什么吗? 据我所知,我有一个“var dateComponents : DateComponents”属性,它不能被 NSManaged 管理。该属性需要在创建类对象时进行初始化。对于常规类,我使用构造函数来初始化 dateComponents 属性,并在任何其他属性发生更改时使用 didSet 更新 dateComponents 属性。 好的。听起来您可以简单地通过扩展将该属性添加为计算属性。

以上是关于如何使用检索到的核心数据对象的主要内容,如果未能解决你的问题,请参考以下文章