2013年9月30日月曜日

CoreData での DISTINCT 取得

CoreData で重複の無いデータを取得する方法が必要だったので調べてみた。
NSFetchRequest の setReturnsDistinctResults に YES を渡せばよい。

具体的なコードは、以下の通り
今回は例として、name が重複しているデータから重複を取り除いてデータを取得する処理を行う。
    // NSFetchRequest は、検索条件などを保持するオブジェクト
    // 後続処理で、このインスタンスに色々と検索条件を設定する。
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    
    // 検索対象エンティティを指定する。
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Theme" 
                                              inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];
        
    // ソートを設定
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = @[sortDescriptor];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // コードで絞り込んだ値を取得する
    NSDictionary *entityProperties = [entity propertiesByName];
    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"name"]]];
    [fetchRequest setReturnsDistinctResults:YES];   // ← ここで指定する
    
    [fetchRequest setResultType:NSDictionaryResultType];
    
    NSError *error;
    NSArray *fetchResults = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchResults == nil) {
        // Handle the error.
        NSLog(@"fetch error.");
    }
これで、NSArray に重複が除去されたデータが格納されている。

0 件のコメント:

コメントを投稿