有谁知道如何模型和代码示例的瞬态到一个在CoreData 关系?例如,我有2个具有一对多关系的实体。医生和约会。现在我想在医生实体上创建一个名为mostRecentAppointment的临时关系。在xcode设计器中建模很简单,但我不确定实现方面。我也应该实施逆?似乎很傻。CoreData短暂关系例如
回答
您需要做的是添加一个名为newAppointment的约会类型的实体,并在每次为给定医生创建新约会时设置此实体。它很简单。
总是实现一个反转,苹果推荐这用于验证和核心数据效率。
或者,您可以对约会进行时间戳记并使用NSPredicates在给定医生的链接约会中搜索最新约会。
KVO支持怎么样?我宁愿像正常的瞬态属性那样利用CoreData框架。 – batkuip 2013-04-29 14:07:24
这是事实,但在大多数情况下,您需要将实际的约会与医生联系起来,反之亦然,因此您仍然需要医生进行实例化。鉴于这是最近的任命。虽然我同意KVO是一个很好的方法,但在这种情况下可能会过度。 – Dev2rights 2013-04-29 14:15:49
Ofc这是一个例子。我的应用程序有点复杂。所以KVO派上用场。由于关系不会被保存(瞬态),当应用程序启动时如何重新建立链接? – batkuip 2013-04-29 14:19:26
看一看这个代码,我最近写了,在NSManagedObject缓存图像:
首先,你在你的模型(通知定义瞬态特性,如果你的瞬态属性指向其他对象类型比由CoreData支持你会离开,如“Undefined
”的模式)
然后,重新生成您的NSManagedObject子类为实体或只是手动添加新的属性,头文件应该是这样的:
@interface Card : NSManagedObject
@property (nonatomic, retain) NSString * imagePath;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * order;
@property (nonatomic, retain) NSString * displayName;
@property (nonatomic, retain) UIImage *displayImage;
@end
在这里,我们班里的瞬态特性的改变实际的类类型
例如这里输入displayImage
是UIImage
。
在实现文件(或扩展类),你实施的getter/setter您的瞬态特性:
-(UIImage*)displayImage{
//Get Value
[self willAccessValueForKey:@"displayImage"];
UIImage *img = (UIImage*)[self primitiveValueForKey:@"displayImage"];
[self didAccessValueForKey:@"displayImage"];
if (img == nil) {
if ([self imagePath]) { //That is a non-transient property on the object
img = [UIImage imageWithContentsOfFile:self.imagePath];
//Set Value
[self setPrimitiveValue:img forKey:@"displayImage"];
}
}
return img;
}
希望帮助你。
我知道如何做到这一点,并且因为您需要处理高速缓存失效和错误,所以涉及的内容多一点。无论我的问题是关于短暂的关系,而不是属性。在短暂的关系中几乎没有任何信息。因此我张贴这个问题。例如,当事物被添加或删除到正常的一对多关系(添加正常约会)时如何处理缓存失效。 – batkuip 2013-04-29 21:34:05
那么,你只需要尝试一下,在你自己的示例程序中,不超过一个小时即可正确设置。
我的猜测是---不需要额外的编码。如果Apple关于CoreData的文档是正确的,则正常属性/关系与“临时”关系之间的唯一区别是后者不会被保留,这意味着当您“保存”时它不会更新持久存储。
我猜测,否则它的所有方面都是完整的,再加上KVO/KVC合规性,撤消支持,验证和通过删除规则自动更新。唯一的一点是,在实体的新获取之后 - 瞬态关系将始终为零。
对于这个---我当然不会建议将临时关系设置为“非可选”,因为大多数实体的大部分时间很可能都为空。
我会建立一个反向关系(瞬态以及明智地命名)并且删除规则都是“Nullify”。
到目前为止是用于临时关系。
但是,我想出了一个替代方案,试图解决几乎相同的问题。我的“任命”是相关任命之一,但不仅仅是“最新”,而是第一个“未完成”的任命。非常类似的逻辑。
而不是一个短暂的关系,我添加了一个新的计算属性来生成NSManagedObject子类我“医生”实体来说,在一个类别,如:
@interface XXDoctor (XXExtensions)
/**
@brief Needs manual KVO triggering as it is dependent on a collection.
Alternatively, you can observe insertions and deletions of the appointments, and trigger KVO on this propertyOtherwise it can be auto-
@return the latest of the to-many appointments relation.
**/
@property (readonly) XXAppointment *latestAppointment; // defined as the
@end
实现:
#import "XXDoctor".h"
#import "XXAppointment.h"
@implementation XXDoctor (XXExtensions)
// this won't work because "appointments" is a to-many relation.
//+ (NSSet *)keyPathsForValuesAffectingLatestAppointment {
// return [NSSet setWithObjects:@"appointments", nil];
//}
- (XXAppointment *) latestAppointment {
NSInteger latestAppointmentIndex = [self.appointments indexOfObjectPassingTest:^BOOL(XXAppointment *appointment, NSUInteger idx, BOOL *stop) {
*stop = (appointment.dateFinished == nil);
return *stop;
}];
return (latestAppointmentIndex == NSNotFound) ? nil : [self.appointments objectAtIndex: latestAppointmentIndex];
}
@end
对不起,但你还没有真正回答我的问题,如何正确实施瞬态关系。在Apple文档中,我一直无法找到关于此主题的很多内容。你有关于这个特定主题的链接吗? – batkuip 2014-09-28 23:47:23
我做到了。没有必要实施。只勾选一个关系为“transient”,重新生成你的NSManagedObject子类,并按你的意愿使用。没有进一步实施。我现在成功地在我的应用程序中使用了一对多和多对多的瞬态关系,没有任何特殊问题。 – 2014-09-30 04:00:05
啊,在我的应用程序中,我还定义了与我的瞬态关系的反向关系,并将它们设置为瞬态关系。我在我的应用程序中使用瞬态关系(与我建议的计算属性相反)的原因是UndoManager将它们视为正常的CoreData更改,并知道如何正常恢复它们。 – 2014-09-30 04:36:41
- 1. CoreData关系错误?
- 2. Coredata关系问题
- 3. 访问CoreData关系
- 4. CoreData中的关系
- 5. 搜索CoreData关系
- 6. CoreData关系混淆
- 7. 对象断层 - CoreData关系
- 8. 使用关系了解CoreData
- 9. CoreData多对多关系
- 10. iOS CoreData - 重建关系
- 11. 延迟加载CoreData关系
- 12. CoreData一对一关系
- 13. 关系数据库 - > CoreData
- 14. CoreData建模逆关系
- 15. Coredata关系实体创建
- 16. Coredata关系,保存字典
- 17. 访问关系对象(CoreData)
- 18. CoreData:关系:保存:查询
- 19. coredata按关系数排序
- 20. 非常短暂的空闲GAE实例
- 21. 问题有关coredata iphone关系
- 22. Objective-C:与自己班的关系(CoreData)
- 23. 使用UIPickerView创建CoreData关系
- 24. CoreData“忘记”NSOrderedSet关系的顺序
- 25. 保存/读取CoreData关系Swift 3
- 26. Restkit 0.20:POST与外键的CoreData关系
- 27. 用CoreData关系计算汇总
- 28. 什么是CoreData中的反比关系
- 29. CoreData一对多关系问题
- 30. CoreData关系在mergeChangesFromContextDidSaveNotification后为零
很肯定暂时不支持瞬间关系,您必须手动合并一个。这可能不会直接回答你的问题,但实现'mostRecentAppointment'关系的最简单方法是在你的数据访问层类中创建一个方法,并用'NSFetchRequest'检索它,其日期描述谓词为 – Eugene 2013-04-29 13:59:32
嗯。设计师确实允许您将关系标记为瞬态。所以它似乎有什么东西。我期待利用随附的KVO和缓存,因为我不想每次访问对象时都执行fetchrequest。希望有类似正常的瞬态属性。 – batkuip 2013-04-29 14:04:57
嗨。你解决了这个问题吗?我是这样解决[一个相关的问题](http://stackoverflow.com/questions/42812151/core-data-fetch-with-predicate-of-transient-relationship-nil)似乎短暂的关系不起作用预期。 – LShi 2017-03-15 14:50:46