【问题标题】:I can't use my core data model in two targets in a Swift project我无法在 Swift 项目的两个目标中使用我的核心数据模型
【发布时间】:2014-10-04 05:11:30
【问题描述】:

Core Data 模型中实体模型的类名必须在其前面加上应用程序名称。因此,对于名为 User 的实体,模型编辑器中的类名必须是 MyAppName.User。在我向项目中添加第二个目标之前,这一切正常。

新项目期望实体类名称为 SecondAppTargetName.User。我们如何使用相同的核心数据模型支持两个目标?我尝试在 ${PRODUCT_NAME}.User 前面添加,而不是期望它会起作用。而且它不起作用。

关于如何在目标之间共享一个核心数据模型并满足 Swift 项目将 PRODUCT_NAME 附加到模型编辑器中的类的需要的任何想法?

编辑: 从Apple documentation here 看来,将模块名称作为前缀添加到模型实体检查器中的类名称是首选行为。如果是这样,这似乎是一个巨大的漏洞,因为它排除了使用相同数据模型的多个目标。我仍然没有找到解决方法。 SO 上的一些帖子表明,在托管对象的 Swift 类定义前面使用 @objc(ClassName) 可以解决问题,但我还无法验证这一点。

【问题讨论】:

  • 您是否尝试过从类名中省略应用程序名?我的核心数据类前面没有应用程序名,它工作正常。事实上,我无法让它与应用程序名称一起使用!我的应用程序名称包含一个空格,我尝试了所有可能的组合以在类前面加上应用程序名称,但无济于事。没有 appname 我没有问题。
  • 是的,我删除了应用程序名称,因为我看到了一些没有它的示例项目。它行不通。我不确定是不是因为我使用了 RestKit,但我看过其他帖子,用户提到他们必须在产品名称前面加上。
  • 在什么方面不起作用? RestKit 应该没有影响。为什么需要在项目名称前面加上(期望的)?你不能在前面加上一些其他的文字吗?
  • 显然这里的解决方案是在您的应用名称中添加一个空格,那么它不是必需的! ;]
  • 我不知道为什么我必须在名字前面加上。如果没有它,我会在 RestKit 设置实体对象映射时出错。对于大多数 Core Data 项目,您不会使用它。我看过其他 Swift Core Data 教程,其中提到需要该产品名称,这就是我开始使用它的原因。

标签: ios core-data swift restkit


【解决方案1】:

我以这种方式使用目标来修复它。我不确定这是否是正确的方法。我会很感激更正。这样,它创建了两个不同的商店和相应的文件。两个应用程序可以在同一设备上使用两个不同的商店。

if(currentTarget==XXX){
    storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Partner.sqlite"];
}
else{
     storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"PartnerNew.sqlite"];
}

【讨论】:

    【解决方案2】:

    事实证明,答案似乎是在 Swift 文件中的类定义上方添加 @objc(ClassName) 指令,如 this StackOverflow answer 中提到的一个相关问题。至少这是现阶段 XCode 6 beta 5 的答案。

    因此,对于名为 User 的实体类,您需要:

    @objc(User)
    class User: NSManagedObject {
        ...
    

    我已经在一个双目标项目中对此进行了测试,并从模型实体检查器中删除了所有前缀并且它可以工作。我想知道为什么 Apple 会在他们的文档中包含前缀要求,因为它对使用相同核心数据模型的多个目标施加了限制。看来@objc 修复是正确的解决方案,或者可能只是此测试阶段的临时解决方案。

    【讨论】:

    • 可以确认这项工作。发现 prelaunch API 指南推荐了一些不起作用的东西,这非常令人沮丧。谢谢
    • 谁有 Objective-c 的解决方案?我有两个目标。两者都是具有相同代码库的不同用途的应用程序。如果我安装这两个应用程序,它使用相同的数据库,来自两个应用程序的所有数据都在同一个数据库内。我希望它是分开的。我必须创建 2 个相同模型的实体吗?
    • 对我不起作用,同样的错误:无法加载类名“entity.model”
    • 您是否从模型中的类名中删除了所有前缀?如果您的班级是“参加者”,请确保从前面删除目标名称。并确保你在类文件中有@objc() 符号。
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多