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



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

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

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


覆盖(void)removeImagesObject:(Image *)value;NSManagedObject子类中的Asset,或者我试图
AssetNSManagedObject子类注册为自身的观察者[self addObserver:self forKeyPath:@"keyImage" options:NSKeyValueObservingOptionNew context:&assetContextForKVO];。在这里,我获得成功的时间只有一半,而获得核心数据的“修复缺失的删除传播”错误的时间只有一半。


还是完全不同的地方?

最佳答案

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

@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/

10-12 05:41