簡體   English   中英

核心數據獲取與另一個對象關系的對象

[英]Core Data Fetching Objects That Are in Relationship to another object

我想獲取與對象A具有多對多關系的對象B(即A - >> B)。 我已經記憶中有A. 我知道我可以從A中獲取B對象的NSSet,但最好是對B對象進行獲取請求(特別是如果我想在UITableView中按日期排序)?

我如何才能提出只獲得屬於單個對象A的B對象的請求?

如果您已經擁有A的實例,只需通過A的訪問者訪問相關的B實例。

如果你需要直接獲取與特定A相關的所有B(在這種情況下你不是),你將為B實體構建一個獲取請求,其中一個謂詞基於Bs與A的(反向)關系。(具體語法將取決於反向關系名稱,以及該反轉是一對一還是多對。)

您必須在B類中指定反向關系才能完成您的要求。

但是,我不確定你為什么要反對(沒有雙關語)來抓取已經在對象A中的B對象集。即使對象本身是延遲加載的,因為你已經在內存中有A,我有預感(雖然專家需要驗證)從A中獲取集合比指定新的NSPredicate更有效,並創建一個全新的Fetch。

當然,通過“更高效”我們談論毫秒,即使在像iPhone一樣慢的設備上也是如此。 我從對象A抓取集合,因為語法更清晰。 它也可能更快的事實是獎金。

你需要在你的A的objectID中使用謂詞,如下所示:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *BEntity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:moc];
[fetchRequest setEntity:BEntity];

NSPredicate *predicate = [NSPredicate 
predicateWithFormat:@"(relationship_to_a = %@)", [yourAInstance objectID]];

[fetchRequest setPredicate:predicate];

其中relationship_to_a是B管理對象中與A的關系的名稱。

希望這可以幫助。

順便說一句:對於那些建議使用關系集中的錯誤的其他答案:我自己嘗試了這個,並且它比獲取它們慢得多,因為Core Data顯然會一個接一個地發出故障(不是批處理),因此,對於較大的套裝來說,它會變得非常慢

實際上,如果你通過提取得到你的A實例,那么你可以嘗試將NSFetchRequest中的relationshipKeyPathsForPrefetching設置為YES,然后關系中的所有對象都不應該是錯誤。 但這對我不起作用,所以我堅持使用'獲取解決方案'。

我處於類似的情況。

我想使用NSFetchedResultsController管理一對多(A - >> B)關系中的B。 現在,一種方法是構建一個類似下面的謂詞並將其應用於實體B:

NSPredicate *Predicate = [NSPredicate predicateWithFormat:
                                   @"ANY hasParent.label == 'A'"];

但這是一種非常緩慢的做事方式,應該不惜一切代價避免。 我在25,000個對象上嘗試了這個以檢索大約300個,並且模擬器花費了大約15秒。 它無法完成對iPhone的獲取並反復崩潰。

另一種方法是做已經提到的事情,從A持有的集合中創建一個NSArray並對其進行排序。 如果將allObjects發送到一個集合,則會返回一個數組。 A是之前獲取的NSManagedObject。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                   initWithKey:@"Name"
                                   ascending:YES];

NSArray *lotsOfB = [[[A hasRelationsTo]
                   allObjects]
                   sortedArrayUsingDescriptors: sortDescriptors];

這非常快。 在模擬器或設備上沒有滯后。 但你不能使用NSFetchedResultsController悲傷的時候:-(

希望有所幫助。

我也處於類似的情況。

我沒有像pingbat那樣多的對象,但用“ANY hasParent.label =='A'”獲取它需要15秒

我確實需要使用NSFetchedREsultsController,因此我必須重新構建模型。 我所做的是將to-many關系存儲為字符串屬性並構造謂詞“hasParent contains%@”。

我學到的教訓是,有一個橫向對多關系的謂詞有很大的性能影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM