2013-04-29 75 views
11

有谁知道如何模型和代码示例的瞬态到一个在CoreData 关系?例如,我有2个具有一对多关系的实体。医生和约会。现在我想在医生实体上创建一个名为mostRecentAppointment的临时关系。在xcode设计器中建模很简单,但我不确定实现方面。我也应该实施逆?似乎很傻。CoreData短暂关系例如

+0

很肯定暂时不支持瞬间关系,您必须手动合并一个。这可能不会直接回答你的问题,但实现'mostRecentAppointment'关系的最简单方法是在你的数据访问层类中创建一个方法,并用'NSFetchRequest'检索它,其日期描述谓词为 – Eugene 2013-04-29 13:59:32

+0

嗯。设计师确实允许您将关系标记为瞬态。所以它似乎有什么东西。我期待利用随附的KVO和缓存,因为我不想每次访问对象时都执行fetchrequest。希望有类似正常的瞬态属性。 – batkuip 2013-04-29 14:04:57

+0

嗨。你解决了这个问题吗?我是这样解决[一个相关的问题](http://stackoverflow.com/questions/42812151/core-data-fetch-with-predicate-of-transient-relationship-nil)似乎短暂的关系不起作用预期。 – LShi 2017-03-15 14:50:46

回答

2

您需要做的是添加一个名为newAppointment的约会类型的实体,并在每次为给定医生创建新约会时设置此实体。它很简单。

总是实现一个反转,苹果推荐这用于验证和核心数据效率。

或者,您可以对约会进行时间戳记并使用NSPredicates在给定医生的链接约会中搜索最新约会。

+0

KVO支持怎么样?我宁愿像正常的瞬态属性那样利用CoreData框架。 – batkuip 2013-04-29 14:07:24

+0

这是事实,但在大多数情况下,您需要将实际的约会与医生联系起来,反之亦然,因此您仍然需要医生进行实例化。鉴于这是最近的任命。虽然我同意KVO是一个很好的方法,但在这种情况下可能会过度。 – Dev2rights 2013-04-29 14:15:49

+0

Ofc这是一个例子。我的应用程序有点复杂。所以KVO派上用场。由于关系不会被保存(瞬态),当应用程序启动时如何重新建立链接? – batkuip 2013-04-29 14:19:26

6

看一看这个代码,我最近写了,在NSManagedObject缓存图像:

首先,你在你的模型(通知定义瞬态特性,如果你的瞬态属性指向其他对象类型比由CoreData支持你会离开,如“Undefined”的模式)

enter image description here

然后,重新生成您的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 

在这里,我们班里的瞬态特性的改变实际的类类型

例如这里输入displayImageUIImage

在实现文件(或扩展类),你实施的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; 
} 

希望帮助你。

+2

我知道如何做到这一点,并且因为您需要处理高速缓存失效和错误,所以涉及的内容多一点。无论我的问题是关于短暂的关系,而不是属性。在短暂的关系中几乎没有任何信息。因此我张贴这个问题。例如,当事物被添加或删除到正常的一对多关系(添加正常约会)时如何处理缓存失效。 – batkuip 2013-04-29 21:34:05

0

那么,你只需要尝试一下,在你自己的示例程序中,不超过一个小时即可正确设置。

我的猜测是---不需要额外的编码。如果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 
+1

对不起,但你还没有真正回答我的问题,如何正确实施瞬态关系。在Apple文档中,我一直无法找到关于此主题的很多内容。你有关于这个特定主题的链接吗? – batkuip 2014-09-28 23:47:23

+0

我做到了。没有必要实施。只勾选一个关系为“transient”,重新生成你的NSManagedObject子类,并按你的意愿使用。没有进一步实施。我现在成功地在我的应用程序中使用了一对多和多对多的瞬态关系,没有任何特殊问题。 – 2014-09-30 04:00:05

+0

啊,在我的应用程序中,我还定义了与我的瞬态关系的反向关系,并将它们设置为瞬态关系。我在我的应用程序中使用瞬态关系(与我建议的计算属性相反)的原因是UndoManager将它们视为正常的CoreData更改,并知道如何正常恢复它们。 – 2014-09-30 04:36:41