2013-04-29 38 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