在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)

但是,这会失败,并显示以下错误:

Terminating app due to uncaught exception ‘NSinvalidargumentexception’,reason: ‘Unacceptable type of value for to-many relationship: property = “tags”; desired type = NSSet; given type = _TtCSs22ContiguousArrayStorage000000000B3440D4; value = (
“<_TtC8MotorNav3Tag: 0xb3437b0> (entity: Tag; id: 0xb343800 ; data: {…})”
).’

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

为了能够在Swift中使用一对多的关系,您需要将属性定义为:
class Node: NSManagedobject {
    @NSManaged var tags: NSSet
}

如果您尝试使用NSMutableSet更改将不会保存在CoreData中.当然,建议在Node中定义反向链路:

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

但是Swift仍然无法在运行时生成动态访问器,因此我们需要手动定义它们.在类扩展中定义它们并放入Entity CoreData.swift文件中非常方便. Bellow是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中定义CoreData关系?的更多相关文章

  1. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用带有NodeJs HTTPS的certificates.cer

    我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJSHTTPS模块一起使用.我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:有解决方案吗解决方法.cer文件可以使用两种不同的格式进行编码:PEM和DER.如果您的文件使用PEM格式编码,您可以像使用任何其他.pem文件一样使用它(有关详细信息,请参见Node.jsdocumentation):如果您的文件使

  3. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  4. ios – CoreData有序关系 – 使用NSFetchRequest批量取消

    或者,是否存在批量不支持的API,它不是私有的?解决方法目前我有一个解决方案,但不是一个干净的解决方案:我希望按照有序关系中的20个小组进行批量修改.所以,每次我索引一个索引,它的索引除以20,我为接下来的20使用新的NSFetchRequest,并通过调用公共字段名称来解除它们.

  5. ios – 使用SQLite和CoreData进行批量插入

    我有一个使用sqlite作为持久性存储的CoreData模型.在对每条记录进行一些处理之后,我需要插入大量的行.有没有办法将这些命令发送到sqlite我需要加快处理时间,因为它需要几个小时才能完成.任何提示将不胜感激.谢谢解决方法将商店添加到商店协调员时,可以指定编译指示:(改编自PersistentStoreFeatures)我强烈建议您阅读“有效导入数据”.相关文档:NSSQLitePragm

  6. 核心数据 – iOS:由于Xcode 9中的Fetched Indexes,无法编译CoreData模型

    根据发行说明,Xcode9增加了对获取索引的支持:“ThedatamodeleditorpresentsaunifiedinterfaceforCoreData’snewfetchindexesfeatureaswellasitsexistingpropertyindexandentitycompoundindexfeatures.Olderdatamodelsaretranslatedintof

  7. 如何在Cocoa中使用Bindings CoreData实现iTunes风格的Source-List?

    让我们说,为了说明,我在Cocoa中编写了一个iTunes克隆应用程序,该应用程序由CoreData支持.为简化起见,假设有两个“部分”,“图书馆”,包括音乐,电影,广播等.第二部分称为“播放列表”,其中包含用户生成的播放列表.所以SourceList本身通常会用NSOutlineView实现,这通常很简单.源列表的“库”部分实际上并不包含用户生成的任何内容,只包含应用程序的“功能”(实质上),其中“播放列表”部分仅包含用户创建的自定义列表.如何用Bindings和CoreData做到这一点?

  8. ios – 未为测试目标生成核心数据类

    我使用CoreData的自动生成的类.除测试目标外,我的项目还有3个目标.对于每个目标,正确生成CoreData类,我通过检查DerivedData文件夹进行验证.但是,尽管在核心数据模型文件中打勾,但不会为测试目标生成类.当我尝试引用测试目标中的一个CoreData类时,这会导致“未声明的标识符”和“使用未声明的类型”错误.我该如何解决这个问题?

  9. ios – 尽管匹配x-coredata id,“CoreData不支持持久的跨店关系”

    有关AbstractSource,我在源代码中没有触摸/控制?我是通过调用来创建Quote和BookinitWithEntity:insertIntoManagedobjectContexteach.)>我注意到错误描述还包括几个“相对的”x-coredataid(形式为“x-coredata:///……”如果是这样,我怎么能影响“绝对”和“绝对”之间的任何选择“相对”x-coredataid?

  10. ios – 我可以安全地在@try catch块中包装’CoreData无法解决错误’错误

    )是的,我偶尔会得到’CoreData无法完成故障’的错误.在我的特定应用程序中,这通常发生在一种“数据绑定”过程中,因此我可以安全地丢弃故障对象并继续前进.我想通过在@try-catch块中包装数据绑定的循环内部并且只跳过我得到CoreData错误的行来完成此操作.我可以使用CoreData安全地执行此操作吗?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部