2011-02-17 248 views
111

我可以用下面的代碼輕鬆地獲得一個物體的核心數據ID:如何從特定對象ID獲取核心數據對象?

NSManagedObjectID *moID = [managedObject objectID]; 

但是,有沒有辦法給它一個特定的對象ID獲取對象了核心數據存儲的?我知道我可以通過使用NSFetchRequest,這樣做:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID]; 
[fetchRequest setPredicate:predicate]; 

不過,我想這樣做的,不主動進行讀取請求的方式。有任何想法嗎?

+0

但是通過獲取請求的方式,您可以設置預取的屬性或關係,這將在您訪問內容時爲您提供卓越的效率,而不僅僅是更多的查詢。 – malhal 2016-10-12 15:24:20

回答

197

你想:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID 
            error:(NSError **)error 

從有ID,或者爲零,如果不存在,實體店獲取的對象。

(注意:有上的NSManagedObjectContext兩種方法與我絆倒了似乎相似,名稱以幫助他們保持筆直,這裏就是另外兩個做:

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID 

...將創建一個故障對象與提供的對象標識,這樣的對象實際上是否存在於存儲中,如果它不存在,任何引發故障的東西都將失敗,除非先用NSManagedObjectContext的insertObject:來插入對象。我們發現這是在保存對象ID的同時將對象從存儲中複製到存儲中。

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID 

...將返回具有該ID的對象,如果它已通過此managedObjectContext從存儲中獲取。如果有人知道這種方法有用,請發表評論。)

[eta .:第一種方法和另外兩種方法的另一個重要區別是existingObjectWithID:error:永遠不會返回錯誤;它總是爲你提取整個對象。如果你試圖避免這種情況發生(例如,使用具有大塊屬性的昂貴獲取對象),那麼你必須聰明地使用objectWithID:objectRegisteredForID:,它們不會觸發故障;或使用正確配置的獲取請求。]

+11

` - (NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID`當您只想查看對象是否已經存在於上下文中而不想獲取它時可能很有用。 – Tony 2012-01-21 02:01:40

2

objectWithID:是您正在查找的方法,並且這是推薦的方法。 objectWithID:將有效地使用NSManagedObjectContext來根據需要提取對象的級別 - 與其他方式不同。 objectWithID:將在轉到備份存儲之前正確使用父上下文,持久存儲協調器和持久存儲本身中的內存信息。

這將在WWDC 2012會話「核心數據最佳實踐」中深入討論。