如何在“详细”实体视图中为“主/父”实体“保存”(核心数据)?

Posted

技术标签:

【中文标题】如何在“详细”实体视图中为“主/父”实体“保存”(核心数据)?【英文标题】:How to "save" (core-data) for "master/parent" entity while in "detail" entity view? 【发布时间】:2014-07-18 14:35:59 【问题描述】:

在我的应用中,我有一个如图所示的模型:

一个播放列表可以没有或有多个项目。在主视图中创建播放列表时,它会与默认数据一起存储,并且视图会转到可以添加/删除项目的项目列表 [详细] 视图。这工作正常。

但是,在详细信息(项目列表)视图中,我希望设置一个属性 (targetEndTime),该属性应存储在引用的播放列表对象中。我希望它在详细视图上而不是在我返回主视图时隐式存储。

我如何做到这一点?

如果最好的做法是从两个视图控制器中重构出核心数据,这将如何完成,以及如何保存到特定的对象引用?

非常感谢您的帮助和意见。

更新 TargetEndTime 是一个集合属性,从中计算开始时间。这是一个“倒计时” - 我想知道开始播放列表集的时间,以便它在 targetEndTime 结束。因此,当设置了 targetEndTime 时,我想将其存储在父实体中。

我如何在代码中实现这一点?我正在传递播放列表:

self.playlistViewController = (BXPlaylistViewController *)segue.destinationViewController;              
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];                  
Playlist *playlist = nil;         
playlist = [self.fetchedResultsController objectAtIndexPath:indexPath];            
self.playlistViewController.playlist = playlist;

【问题讨论】:

目标结束时间会根据添加的项目数量(和持续时间)而变化,对吗? 不,它是一个集合属性,从中计算开始时间。这是一个“倒计时” - 我想知道开始播放列表集的时间,以便它在 targetEndTime 结束。因此,当设置了 targetEndTime 时,我想将其存储在父实体中。 从数据模型中可以看出,Item 也与其Playlist 具有反比关系。因此,您可以访问Item 的播放列表并修改其targetEndTime 我可以在哪里/如何在代码中实现这一点?我正在传递播放列表:self.playlistViewController = (BXPlaylistViewController *)segue.destinationViewController; NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; Playlist *playlist = nil; playlist = [self.fetchedResultsController objectAtIndexPath:indexPath]; self.playlistViewController.playlist = playlist; 我认为您对 CoreData 的经验并不多。你真的应该从更简单的事情开始。解释你应该如何实现目标超出了我的能力范围。 【参考方案1】:

如 cmets 所述,您可以通过其关系直接访问项目的播放列表。

所以假设您在其详细视图中保留对列表的引用。

例如@property Item *focusedItem

-(void)updateTargetEndTime:(NSTimeInterval)timeInterval 

    Playlist *playlist = [self.focusedItem valueForKey:@"playlist"];

    [playlist setValue:@(timeInterval) forKey:@"targetEndTime"];


这是最原始的版本,但是随着您使用 coredata 进行升级,您将需要使用像 mogenerator 这样的工具或只是 Xcode

为您的托管对象创建 shim 类,这样您就可以像这样表达它。

-(void)updateTargetEndTime:(NSTimeInterval)timeInterval 

    item.playlist.targetEndTimeValue = timeInterval;


【讨论】:

不需要发电机。 Xcode 也能做到这一点(而且可能更好)。

以上是关于如何在“详细”实体视图中为“主/父”实体“保存”(核心数据)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将来自多个视图控制器的数据保存到单个核心数据实体中

UICollectionview 在使用 Core Data 保存实体后重新加载数据

如何在 Hibernate 中为某些实体禁用模式验证?

从集合视图移动到详细视图时如何利用 CoreData

如何在 JpaRepository 中为多对一映射实体编写查询

如何在 Visual Studio 2013 中为 sqlite 配置实体框架 6