将模块名称添加到核心数据实体

Posted

技术标签:

【中文标题】将模块名称添加到核心数据实体【英文标题】:Adding Module Name to Core Data Entities 【发布时间】:2014-08-15 01:34:25 【问题描述】:

我无法弄清楚this note from Apple's "Using Swift with Cocoa and Objective-C" 的含义:

Swift 类是命名空间的——它们的作用域是编译它们的模块(通常是项目)。要将 NSManagedObject 类的 Swift 子类与您的 Core Data 模型一起使用,请在 Class 中为类名添加前缀模型实体检查器中带有模块名称的字段。

我已经这样做了,使用我自己的应用程序和库存主从模板,所以我的实体的名称是“事件”,它的类是“Stock_Master_Detail.Event”。当我从Editor 菜单中选择Create NSManagedObject Subclass 并要求它创建一个Swift 子类时,它没有正确命名该类。 Xcode 为名为@9​​87654325@ 的类创建了一个名为“Stock_Master_Detail.swift”的文件。如果我创建多个实体,所有实体都以模块名称为前缀,Xcode 无法生成多个子类,因为它们最终都会具有相同的名称。

我会补充一点,如果我完全省略模块名称,那么在我有限的测试中一切正常,这与 Apple 的文档相反。那么,我的问题是,不将模块名称添加到我的类有什么影响?

【问题讨论】:

我也有同样的问题。我的应用程序名称包含空格,我已经尝试了模块名称的所有可能组合(使用空格、下划线......)但无济于事。没有模块名称一切正常。 【参考方案1】:

我解决此问题的一种方法是单独保留数据模型文件,因此在这种情况下,类将是“事件”。然后在创建 NSManagedObjectModel 的代码中(如果您使用 Apple 的项目模板,则为 AppDelegate)我将其更改为:

lazy var managedObjectModel: NSManagedObjectModel = 
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle(forClass: self.classForCoder).URLForResource("Model", withExtension: "momd")!
    var bundleModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    var objectModel = NSManagedObjectModel()
    objectModel.entities = bundleModel.entities.map  ( entity ) -> NSEntityDescription in
        var entityCopy = entity.copy() as NSEntityDescription
        entityCopy.managedObjectClassName = "Stock_Master_Detail." + entity.managedObjectClassName
        return entityCopy
    

    return objectModel
    ()

一个改进,我想弄清楚如何动态找到模块名称。我知道我可以解析当前类的名称,但这感觉比我想要的更奇怪。

【讨论】:

【参考方案2】:

我认为这可能是 Swift/Core Data 的一个错误。首先,生成没有模块名称(前缀)的托管对象。生成后,再回去在核心数据中添加前缀。

【讨论】:

以上是关于将模块名称添加到核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

核心数据搜索和更新

在 Swift 3(核心数据)中引用实体属性

Swift - 使用 for 循环将数据添加到核心数据

核心数据:无法将持久存储添加到协调器

JPA 2.0:自动将实体类*从不同的 jar* 添加到 PersistenceUnit

Asp.net 核心 - 实体框架核心 - 将附加数据添加到视图对象,同时保持它是可查询的