对象之间的核心数据关系

     2023-03-05     124

关键词:

【中文标题】对象之间的核心数据关系【英文标题】:Core Data Relation between Objects 【发布时间】:2014-08-27 13:07:10 【问题描述】:

我有一个关于如何在 Core Data 中创建 2 个 NSObject 之间的关系的问题。

首先我有这个 CoreData 结构。

文件和表单之间存在关系。一个表格可以有多个文件,但一个文件只能有一个表格。

我只用 Swift 创建了 NSObjects(所以没有桥接头) - 现在有 2 个核心数据 NSObject 类:

class Forms: NSManagedObject 

@NSManaged var uuid: String
@NSManaged var damagenumber: String
@NSManaged var internalnumber: String
@NSManaged var date: NSDate
@NSManaged var name: String
@NSManaged var street: String
@NSManaged var postalcode: String
@NSManaged var city: String
@NSManaged var country: String
@NSManaged var templateJSON: String
@NSManaged var formname: String
@NSManaged var files: NSSet



class Files: NSManagedObject 

@NSManaged var url: String
@NSManaged var forms: Forms


我的文件作为 NSSet 在这里。

所以,我想例如添加一个包含 5 个文件的表单。所以从这样的开始:

var request = NSFetchRequest(entityName: "Forms")
request.returnsObjectsAsFaults = false;

let newFormObject = NSEntityDescription.insertNewObjectForEntityForName("Forms", inManagedObjectContext: context) as Forms

newFormObject.setValue(uuid, forKey: "uuid")
......

// 插入文件

 for index in 0...4 

     var request = NSFetchRequest(entityName: "Files")
     request.returnsObjectsAsFaults = false;

     let newFileObject = NSEntityDescription.insertNewObjectForEntityForName("Files", inManagedObjectContext: context) as Files
     newFileObject.setValue(arrFiles[index], forKey: "url")


好的,一切正常。但是:我如何连接这 2 个对象?如果您使用 Obj-C NSObjects 而不是 Swift,我有一些方法可以将文件添加到表单。但是我怎样才能只在 Swift 中做到这一点呢?

如果我有关系 - 我如何从某个表单中读取所有文件对象?

编辑:

我现在改行了:

@NSManaged var files: NSSet

@NSManaged var files: [Files]

并在循环中使用:

newFormObject.files.append(newFileObject)

这给我带来了以下错误:

*** 错误:这个进程调用了一个 NSArray-takeing 方法,例如 initWithArray:,并传入了一个 NSSet 对象。目前正在解决此问题,但很快就会让您感到悲伤。

【问题讨论】:

【参考方案1】:

减少您的代码:仅在您需要检索对象时设置 NSFetchRequests。因此,每次创建新对象时都不需要以下行:

//Forms
var request = NSFetchRequest(entityName: "Forms")
request.returnsObjectsAsFaults = false;

//Files
var request = NSFetchRequest(entityName: "Files")
request.returnsObjectsAsFaults = false;

保持一致:您已经设置了 NSManagedObject 子类。所以使用它们,不要使用键值编码。替换:

newFormObject.setValue(uuid, forKey: "uuid")

与:

newFormObject.uuid = uuid

问题:

如何连接这 2 个对象?

在循环结束时一行代码就足够了:

newFileObject.forms = newFormObject // where forms is the name of your relationship

问题:

我如何从某个表单中读取所有文件对象

当您需要检索某个 FormFiles objects 时,您可以执行 NSFetchRequest(允许您设置谓词、排序等等),或者您可以像这样简单地获取所有相关对象的 NSSet :

    //Get all Files objects (of a to-many relationship) related to a single Form object
    let filesSet = myForm.files as NSSet //where myForm is a Form managedObject
    let filesArray = filesSet.allObjects as Array

    for obj in filesArray as [Files] 
        println(obj.url)
    

【讨论】:

感谢您的回复:如果我使用:newFormObject.files = newFileObject 编译器告诉我:文件不可转换为 NSSet 因此将我的 NSSet 更改为 [Files] - 但现在:“文件与 Anyobject 不同” newFileObject.forms = newFormObject; 不要改变你的 NSManagedObject 子类。它们在您帖子的开头看起来很好。删除其中的 NSSet 会破坏您的核心数据。 尝试删除您的应用并重建它。每次更改 NSManagedObject 子类时,您的应用都必须符合新的核心数据模型。

核心数据:非法尝试在不同上下文中的对象之间建立关系“状态媒体”

】核心数据:非法尝试在不同上下文中的对象之间建立关系“状态媒体”【英文标题】:CoreData:Illegalattempttoestablisharelationship\'statusmedia\'betweenobjectsindifferentcontexts【发布时间】:2018-09-0711:12:55【问题描述】:我在我的应用程序上... 查看详情

RestKit、核心数据和关系问题。父对象不识别子集

】RestKit、核心数据和关系问题。父对象不识别子集【英文标题】:RestKit,CoreData,andRelationshipproblems.Parentobjectnotrecognizingchildset【发布时间】:2012-09-1617:41:02【问题描述】:我正在尝试使用RestKit映射文章和属于它们的照片之间的关... 查看详情

在核心数据一对多关系中多次使用同一个对象

】在核心数据一对多关系中多次使用同一个对象【英文标题】:Havingmultipletimethesameobjectinacoredataone-to-manyrelationship【发布时间】:2014-04-1613:20:28【问题描述】:我的核心数据模型中有两个实体:图书馆和书籍。它们通过Library和Boo... 查看详情

如何设置核心数据实体之间的关系?

】如何设置核心数据实体之间的关系?【英文标题】:Howtosettherelationshipbetweenthecoredataentities?【发布时间】:2018-04-1112:22:43【问题描述】:所以,我有一个核心数据数据库,其中已经填充了数据的多个关系。我的问题是我创建了... 查看详情

如何为对象计数多个关系创建谓词?核心数据 iOS Swift

】如何为对象计数多个关系创建谓词?核心数据iOSSwift【英文标题】:HowTocreatepredicateforobjectcountseveralrelationshipsdeep?CoreDataiOSSwift【发布时间】:2014-09-1118:29:16【问题描述】:我有一个相当棘手的问题,我还没有找到答案,希望您... 查看详情

核心数据空关系

...“creatorUser”关系不是可选的,所以当我去保存我的托管对象上下文时,CoreData会给出错误,因为它认为“creatorUser”是nil。我们会非常建议您提供任何帮助。NSM 查看详情

实体之间的核心数据关系

】实体之间的核心数据关系【英文标题】:coredatarelationshipbetweenentities【发布时间】:2011-06-2106:44:51【问题描述】:您好,我需要在我的应用程序中使用coredata关系。coredata关系对我来说是第一个。请指导我。我需要有2个实体“... 查看详情

映射核心数据关系的正确方法

...2012-06-1115:27:35【问题描述】:我需要在CoreData中创建两个对象之间的关系。我不确定如何建立关系。当我尝试然后运行我的应用程序时,它会永远循环并崩溃(猜测循环引用)。mainObject.hNSString*userId;NSString*thing;NSString*descr;NSSt 查看详情

从具有实体之间关系的核心数据中获取数据[重复]

】从具有实体之间关系的核心数据中获取数据[重复]【英文标题】:Fetchdatafromcoredatahavingrelationshipsamongentities[duplicate]【发布时间】:2015-06-1805:19:37【问题描述】:在我的核心数据模型中,我有2个实体,例如部门和员工,dept实体... 查看详情

核心数据关系与关系中的参数

...:03:45【问题描述】:我有一个CoreData项目,我想建立2个人之间的关系,但我希望能够设置或更改2个人之间的关系类型。假设我有一个名为“Person”的核心数据实体,我在“Person”和“Person”之间建立了一个关系,我称之为bioFathe... 查看详情

使用 NSPredicate 过滤核心数据中的对象

】使用NSPredicate过滤核心数据中的对象【英文标题】:UseNSPredicatetofilterobjectincoredata【发布时间】:2012-10-1208:50:52【问题描述】:我有三个实体A、B、C。它们之间的关系是:A>B,BC。A有一个名为“类型”的属性。A和B的关系是a2b... 查看详情

使用 NSPredicate 的特定对象内的核心数据 NSFetchRequest

】使用NSPredicate的特定对象内的核心数据NSFetchRequest【英文标题】:CoreDataNSFetchRequestwithinspecificobjectusingNSPredicate【发布时间】:2016-02-2313:25:03【问题描述】:我有一个核心数据实体,“实体1”,它与另一个实体“实体2”之间存... 查看详情

hibernate之核心接口

  1.持久化和ORM    持久化是指把数据(内存中的对象)保存到可持久保存的存储设备中(如硬盘),主要应用于将内存中的数据存储到关系型数据库中,在三层结构中,持久层专注于实现系统的逻辑层面,将数据使用者... 查看详情

获取对象是不是也获取核心数据中的关系对象

】获取对象是不是也获取核心数据中的关系对象【英文标题】:Doesfetchingobjectalsofetchesrelationshipobjectsincoredata获取对象是否也获取核心数据中的关系对象【发布时间】:2013-02-2712:50:28【问题描述】:我在核心数据中有一对多的关... 查看详情

将核心数据对象传递给新的表视图控制器,但使用对象的关系在新视图控制器中显示该数据

】将核心数据对象传递给新的表视图控制器,但使用对象的关系在新视图控制器中显示该数据【英文标题】:PassingaCoreDataObjecttoanewTableViewController,butUsingtheObject\'sRelationshiptoDisplayThatDatainthenewViewController【发布时间】:2013-11-1919:59:... 查看详情

核心数据关系中出现不需要的对象

】核心数据关系中出现不需要的对象【英文标题】:unwantedobjectsappearingincoredatarelationship【发布时间】:2013-08-0502:32:22【问题描述】:很长的问题---提前感谢您的时间。保存新的托管对象后,我发现它们已添加到我的核心数据数... 查看详情

核心数据:同一个对象的多个关系

】核心数据:同一个对象的多个关系【英文标题】:CoreData:Multiplerelationstosameobject【发布时间】:2013-01-1116:26:27【问题描述】:我有一个包含(以及其他)WorkingPlan和Position的核心数据数据库。WorkingPlan有零个或多个Position对象。... 查看详情

自定义核心数据映射:在现有关系之间插入新实体

】自定义核心数据映射:在现有关系之间插入新实体【英文标题】:CustomCoreDatamapping:Insertinganewentityinbetweenanexistingrelationship【发布时间】:2014-05-1010:04:59【问题描述】:我的数据模型版本1的示例如下所示:蛋糕被一些客人吃掉... 查看详情