当前位置: 首页 > 面试题库 >

如何在Swift中定义CoreData关系?

查飞星
2023-03-14
问题内容

在CoreData中,我定义了从Node到无序的多对多关系Tag。我创建了一个这样的Swift实体:

import CoreData
class Node : NSManagedObject {
    @NSManaged var tags : Array<Tag>
}

现在,我要向Tag的实例添加Node,如下所示:

var node = NSEntityDescription.insertNewObjectForEntityForName("Node", inManagedObjectContext: managedObjectContext) as Node
node.tags.append(tag)

但是,此操作失败并显示以下错误:

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“一对多关系的值的不可接受类型:property =“
tags”; 所需的类型= NSSet ; 给定类型=
_TtCSs22ContiguousArrayStorage000000000B3440D4; 值=(“
<_TtC8MotorNav3Tag:0xb3437b0>(实体:Tag; id:0xb343800; data:{…})”)。

一对多关系的正确类型是什么?


问题答案:

为了能够在Swift中处理一对多关系,您需要将property定义为:

class Node: NSManagedObject {
    @NSManaged var tags: NSSet
}

如果您尝试使用NSMutableSet更改,则不会保存在CoreData中。当然,建议在以下位置定义反向链接Node

class Tag: NSManagedObject {
    @NSManaged var node: Node
}

但是Swift仍然无法在运行时生成动态访问器,因此我们需要手动定义它们。在类中定义它们extension并放入Entity+CoreData.swift文件中非常方便。波纹管是Node+CoreData.swift文件的内容:

extension Node {
    func addTagObject(value:Tag) {
        var items = self.mutableSetValueForKey("tags");
        items.addObject(value)
    }

    func removeTagObject(value:Tag) {
        var items = self.mutableSetValueForKey("tags");
        items.removeObject(value)
    }
}

用法:

// somewhere before created/fetched node and tag entities
node.addTagObject(tag)

重要说明: 要使其全部正常工作,您应该验证CoreData模型中实体的类名称包括模块名称。例如MyProjectName.Node



 类似资料:
  • 问题内容: 我正在用Swift编写iOS游戏,但我想在结尾加上高分标签。我认为保存功能是正确的,但负载之一就是给我带来麻烦的功能。我已经创建了一个实体(“ BestScores”)和属性(“ classicBestScoreTF”): 要保存最高分: 它不起作用:(请帮忙! 问题答案: 保存数据: 加载数据中:

  • 问题内容: 我在JPA中使用实体映射存在以下问题。我有两个实体,第一个是Lookup,第二个是Text,它表示实体的翻译。现在,我需要将Lookup绑定到Text,但是我不希望Text引用Lookup。更复杂的是,Text在此关系中不使用其主键,而是在列中定义的元代码 。 因此,我尝试了这种方法(以及其他几种方法),但没有结果。我也不能在数据库中创建联接表,也不想将Lookup绑定到Text类。所

  • 关于JPA中的实体映射,我有以下问题。我有两个实体,第一个是查找,第二个是表示实体翻译的文本。现在我需要将Lookup绑定到文本,但我不希望文本引用Lookup。为了使这种情况更加复杂,文本在此关系中不使用其主键,而是使用列中定义的元码。 所以我尝试了这个(和其他一些变体),但没有结果。我也不能在数据库中创建连接表,我不想绑定查找到我的文本类。谁能告诉我有没有别的办法?

  • 问题内容: 我正在使用xcode 6,并且已经导入和。我还添加了文件巫婆导入sqlite3.h 我可以打开SQLite数据库并执行简单操作,例如插入选择… 用 我有一个错误: 我做什么表演?我是Swift的新手,这是我在Stack上的第一个问题,请有人帮助我! 问题答案: 定义 from 不会导入到Swift中,可能是由于“不安全”的指针强制转换。 SQLite.swift项目的 Statemen

  • 问题内容: 在Swift中有可能吗?如果没有,那么是否有解决方法? 问题答案: 1.使用默认实现(首选)。 优点 不涉及Objective-C运行时 (至少没有明确 涉及 )。这意味着您可以使其符合结构,枚举和非类。同样,这意味着您可以利用强大的泛型系统。 *当遇到符合此类协议的类型时, *您始终可以确保满足所有要求 。它始终是具体实现或默认实现。这就是“接口”或“合同”在其他语言中的行为方式。

  • 问题内容: 在Objective-C中,自定义通知只是一个普通的NSString,但是在Swift 3的WWDC版本中并不明显。 问题答案: 您也可以为此使用协议 然后将您的通知名称定义为所需的任何位置。例如: 并像这样使用 这样,通知名称将与基金会分离。而且您只需要修改协议,以防更改实现。