0

fetchRequestをフィルタリングしようとしています。

結果がNSArrayにロードされる時点です。

ただし、配列を解析して個々のアイテムを引き出す必要があります。現在、それらは1つのオブジェクトであるかのように見えます。

この点に到達するために使用しているコードは次のとおりです。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSManagedObjectContext *moc = coreDataController.mainThreadContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:moc];

[request setEntity:entity];


    // Order the events by name.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

    [request setSortDescriptors:@[sortDescriptor]];

    // Execute the fetch -- create a mutable copy of the result.
    NSError *error = nil;
    NSArray *categories = [[moc executeFetchRequest:request error:&error] mutableCopy];

    if (categories == nil) {
        NSLog(@"bugger");
    }

    NSObject *value = nil;
    value = [categories valueForKeyPath:@"name"];

これにより、次のようになります。

 value = (
)

[DetailViewController loadPickerArray]
[AppDelegate loadPickerArray]
 value = (
    "Cat Two",
    "Cat Three",
    "Cat One",
    "Cat Four"
)

また、これが最初に実行されたとき、結果がなかったことに注意してください。私はそれを約50%の確率で得ます。

助けてくれてありがとう。

4

1 に答える 1

1

データをフィルタリングする方法はいくつかあります。

推奨される方法は、検索に述語を使用することです。これにより、最高のパフォーマンスが得られます。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSManagedObjectContext *moc = coreDataController.mainThreadContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:moc];

[request setEntity:entity];

// Order the events by name.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[CD] %@", @"Cat"]; //This will return all objects that contain 'cat' in their name property.

[request setPredicate:predicate];
[request setSortDescriptors:@[sortDescriptor]];

// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSArray *categories = [moc executeFetchRequest:request error:&error];

if (categories == nil) {
    NSLog(@"bugger");
}

//Here you have the objects you want in categories.

for(Category *category in categories)
{
    NSLog(@"Category name: %@", category.name);
}

配列を使用してフィルタリングする場合は、次のことも可能です。

NSMutableArray *categories = [[moc executeFetchRequest:request error:&error] mutableCopy];

[categories filterUsingPredicate:[NSPredicate predicateWithFormat:[NSPredicate predicateWithFormat:@"name CONTAINS[CD] %@", @"Cat"]]

//Now, the only objects left in categories will be the ones with "cat" in their name property.

述語は非常に強力であり、ストアで結果をフィルタリングする方がはるかに効率的であるため、述語プログラミングガイドを読むことをお勧めします。

于 2012-12-08T03:00:32.620 に答える