有誰知道如何模型和代碼示例的瞬態到一個在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 N:M關係
- 3. Coredata鏈接關係
- 4. Coredata關係創建
- 5. 訪問CoreData關係
- 6. Coredata關係問題
- 7. CoreData中的關係
- 8. CoreData關係錯誤?
- 9. 搜索CoreData關係
- 10. CoreData關係混淆
- 11. 關係數據庫 - > CoreData
- 12. CoreData關係返回_NSCoreDataTaggedObjectID
- 13. CoreData:關係:保存:查詢
- 14. Coredata關係實體創建
- 15. CoreData:多對多關係
- 16. CoreData:基於關係的NSPredicate
- 17. 延遲加載CoreData關係
- 18. CoreData BEGINSWITH多對多關係
- 19. CoreData一對一關係
- 20. 對象斷層 - CoreData關係
- 21. CoreData - Xcode 5 - M:N關係
- 22. 在CoreData中建立關係
- 23. CoreData多對多關係
- 24. 使用關係瞭解CoreData
- 25. Coredata關係,保存字典
- 26. 改變的NSMutableOrderedSet CoreData關係
- 27. 訪問關係對象(CoreData)
- 28. iOS CoreData - 重建關係
- 29. CoreData建模逆關係
- 30. CoreData沒有反比關係
很肯定暫時不支持瞬間關係,您必須手動合併一個。這可能不會直接回答你的問題,但實現'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