CoreData 一对多关系问题

Posted

技术标签:

【中文标题】CoreData 一对多关系问题【英文标题】:CoreData one-to-many relationship issues 【发布时间】:2013-03-14 07:47:23 【问题描述】:

我正在处理 coreData 一对多的关系。例如文件夹 - 文件。所以我想做的是从一个文件夹中取出一个文件并将其复制到另一个文件夹。

So for example 
folder   A  B
file     a  b
file     c  d

现在我想将文件 c 从文件夹 A 复制到文件夹 B,它应该是这样的

folder A B
file   a b
file   c d
file     c

为了执行这个操作,我写了这段代码 这发生在某些导航操作后打开的视图控制器中

首先我在这里提取所有文件夹

 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Folder" inManagedObjectContext:self.managedObjectContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];
    NSError *error = nil;
    m_folderResults = [self.managedObjectContext executeFetchRequest:request error:&error];

然后我创建了一个新的文件实例

File *fileObject = [NSEntityDescription insertNewObjectForEntityForName:@"File" inManagedObjectContext:self.managedObjectContext];
    fileObject = (passed file object to this ViewController)

Folder *folderObject = [m_folderResults objectAtIndex:m_indexPath.row];

    NSMutableOrderedSet *files = [folderObject mutableOrderedSetValueForKey:@"file"];
    [files addObject:fileObject];

这是可行的,但我面临的问题是我是这样理解的

folder A B
file   a b
file     d
file     c

意味着它从一个文件夹中被删除并被添加到另一个文件夹中。

所以我想知道我哪里出错了。

问候 兰吉特

【问题讨论】:

似乎您实际上并没有进行文件复制。我在这里看不到导致此问题的代码。你能再分享一些代码吗? 会不会是在fileObject = (passed file object to this ViewController) 中,您将新创建的文件对象替换为您要复制的文件对象?您可能不得不复制属性,例如fileObject.name = oldFileObject.name, .... 嗨@MarkKryzhanouski,实际上这是我为将一个文件从一个文件夹复制到另一个文件夹而编写的,我没有更多代码可以分享 好的,然后澄清fileObject = (passed file object to this ViewController)是什么意思? @Ranjit:所以你分配一个新值给fileObject?这不会复制对象。 【参考方案1】:

首先,根据您发布的代码,您正在用旧文件对象覆盖新创建的文件对象。当然,如果你在别处插入它,它就会从原来的位置消失。

其次,如果您想要 (1) 真正复制文件 c,您想要创建一个新实例并将其分配到不同的文件夹,或者您 (2) 只是想要第二个文件夹也指向同一个文件(如果文件不更改,这将是有意义的)。

对于情况(1)你必须

File *fileToBeCopied; 
Folder *destinationFolder;
File *newFile = [NSEntityDescription insertNewObjectForEntityForName:@"File" 
                          inManagedObjectContext:self.managedObjectContext];

// now you need to copy all the attributes of fileToBeCopied
// over to newFile

[destinationFolder addFileObject:newFile];
// or
newFile.folder = destinationFolder;

对于情况 (2),请确保您的数据模型允许一个文件有多个文件夹(多对多关系)。

[destinationFolder addFileObject:fileToBeCopied];
// or
[fileToBeCopied addFolderObject:destinationFolder];

【讨论】:

嗨@Mundi,您的第二个解决方案似乎是完美的,但正如我所提到的,我有一对多的关系,将其更改为多对多容易吗?跨度> 是的,只需修改模型,重新生成类文件(这将为您提供方法addFolderObject:),从模拟器或测试设备中删除应用程序,您就可以开始了。 它不会破坏任何东西,它只会在 .h 文件中创建一个 NSOrderedSet 文件夹,对吧? 那行不通。您将不得不调整底层核心数据模型,以便将更改保留在数据库中。 好的,它破坏了我的很多代码,因为如果我使用多对多关系,我会得到一组 NSOrdered 文件夹,并且我无法使用 fileObject 访问该文件夹,因为它不存在.

以上是关于CoreData 一对多关系问题的主要内容,如果未能解决你的问题,请参考以下文章

保存一对多关系CoreData

CoreData:一对多关系显示问题

CoreData 一对多关系。 NSSet 归属问题

无法使用 Swift 在 CoreData 中访问一对多关系

CoreData - 一对多关系

CoreData - 如何在一对多关系中添加多个对象