objective-c - 当删除前一个元素时,如何设置与其他元素的一对一关系?

标签 objective-c cocoa core-data

我有两个核心数据实体: Assets 和图像。 Assets 与图像具有一对多和一对一关系。见图:

To-Many and To-One relationship

对于域,Asset>keyImage 必须是 Asset>images 之一,因此如果从 Asset>images 中删除了某个图像,则该图像不再是 keyImage,并且 keyImage 变为 nil。 (我有那部分工作)。

如果 Asset>keyImage 变为 nil(被删除),我想将其自动设置为 Asset>images 中的其他图像之一(如果有)。

我的问题是如何放置将 keyImage 设置为 Asset>image 中下一个图像的代码。我在想:

  • AssetNSManagedObject子类中重写(void)removeImagesObject:(Image *)value;,或者我尝试这样做
  • NSManagedObjectAsset 子类注册为观察者[self addObserver:self forKeyPath:@"keyImage"options:NSKeyValueObservingOptionNew context:&assetContextForKVO]; 自身。在这里,我有一半的时间成功,一半的时间我从核心数据中收到“修复丢失的删除传播”错误。

或者完全不同的地方?

最佳答案

由于 Asset 具有一组图像(如一对多关系所暗示的),因此它知道自身可用的所有图像。如果 keyImage 从 Image 中删除,那么当你的代码引用 Asset 时,它应该检查 keyImage 是否为零。如果是,那么它应该从图像(关系)集中选择另一个图像并将其设置为 keyImage。 SQLite 无法自动为您执行此操作,就像它无法任意将图像分配给您的 Assets 一样。

@interface Asset : NSManagedObject
//...
@property (nonatomic, retain) NSSet *images;
@property (nonatomic, retain) Image *keyImage;
//...
@end

@interface MyViewController
//...
// fetch an asset object then
if (self.asset.keyImage == nil && [self.asset.images count] > 0)
    [self.asset addImagesObject:[asset.images anyObject]];
@end

关于objective-c - 当删除前一个元素时,如何设置与其他元素的一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614119/

相关文章:

ios - 将音频修剪为视频长度

iphone - 适用于 iPhone 的低内存占用的 CSV 解析器

ios - 在 Xcode 的 Core Data Model 中可以有多个同名反向关系的一对一关系吗?

swift - 如何获得扩展以返回子类类型

iphone - UIPageViewController 的 NavigationBar 不显示标题

ios - 如何从匹配 NSNumber 的 NSMutableArray 中删除对象

cocoa - 将 NSColorWell 绑定(bind)到 NSTextField

cocoa - 在 UIView 中的 let 语句中引用 self.frame

objective-c - HTML 到 NSString

ios - 使用 RestKit 与 ios 5 核心数据并发时崩溃