3

我有兩個實體,A和B,以下關係式:過濾NSFetchedResultsController只得到一些關係的對象

A - > b - 要多

乙 - > - 要一個

換句話說:一個可以有零個或多個B和B只能有一個A.

我想用NSFetchedResultsController顯示在表視圖我的參賽作品,但我想通過一個過濾結果 - > B關係。 這樣做,我有一個UISegmentedControl,如果用戶點擊第一個段我想只顯示與B至少有一個關係的條目,並且如果第二個段被點擊,我想只顯示沒有條目與B的關係

我使用CoreData的NSManagedObject,所以我的目的有與A的關係,所有的B條目的NSSet財產

這是如何我實例化我的NSFetchedResultsController:

NSManagedObjectContext *context = self.managedObjectContext; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:"A" inManagedObjectContext:self.managedObjectContext]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:descriptorKey ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [fetchRequest setEntity:entity]; 


    NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] 
               initWithFetchRequest:fetchRequest 
               managedObjectContext:context 
               sectionNameKeyPath:controllerKey 
               cacheName:nil]; 

    NSError *error; 
    BOOL success = [controller performFetch:&error]; 

    if (success) { 
     return controller; 
    } 

此代碼獲取所有A條目,我如何製作該過濾器?

+0

您的提取請求沒有謂詞。這就是您定義過濾器的地方。 – Abizern

+0

但是,我怎麼能做一個謂詞過濾關係?我試圖通過驗證NSSet計數,但迄今爲止沒有成功。 – douglasd3

回答

6

您需要一個謂詞添加到您的讀取請求:

例如

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[email protected] == 0"]; 
[fetchRequest setPredicate:predicate]; 

這將過濾A s表示沒有任何相關的乙對象。

+0

像魅力一樣工作!我在設置謂詞錯誤,我正在做[NSPredicate predicateWithFormat:@「B.count == 0」]而不是[NSPredicate predicateWithFormat:@「B. @ count == 0」]。非常感謝! – douglasd3

2

正如@Abizern在評論中提到的,您需要爲您的NSFetchedResultsController添加NSPredicate。謂詞會是這樣的:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"b == %@", myVarReferenceToB]]; 

如果你只有在B中的唯一標識符(可以稱之爲identifier),而不是一個對象引用,你可以把它寫成:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"b.identifier == %@", myVarReferenceToBIdentifier]]; 

這將產生你的過濾器。

每次用戶更改分段控件時,都需要重新構建抓取,否則每個段需要保留一個NSFetchedResultsController

+0

如果您要重建fetch,並且NSFetchedResultsController使用緩存,請記住調用[deleteCacheWithName:](https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference。 html#// apple_ref/occ/clm/NSFetchedResultsController/deleteCacheWithName :) – Abizern

相關問題