iPhone OS: Выборка случайного экземпляра объекта с помощью NSPredicate Nsfetchrequest и базовых данных

Работа над приложением, где у меня есть большое количество управляемых объектов, против которых я хочу выбрать несколько случайных экземпляров.

Мой вопрос, там любой способ, которым я могу использовать NSPredicate и NSFetchRequest для возврата нескольких объектов наугад.

Я видел, что Вы могли на самом деле добавить NSFetchRequest в объект с помощью средства моделирования данных, какой-либо способ сделать случайную выборку с помощью этого?

Также что было бы лучшим методом для определения "количества" таблицы, таким образом, я могу установить границы генератора случайных чисел.

сообщите мне, нужно ли Вам больше деталей.

Спасибо!

Nick

11
задан nickthedude 13 May 2010 в 21:42
поделиться

1 ответ

Это может быть не совсем как вы это реализуете, но, надеюсь, с этого вы начнете.

Где-то в вашем заголовке или в верхней части файла реализации:

#import <stdlib.h>
#import <time.h>

В другом месте вашей реализации:

//
// get count of entities
//
NSFetchRequest *myRequest = [[NSFetchRequest alloc] init];
[myRequest setEntity: [NSEntityDescription entityForName:myEntityName inManagedObjectContext:myManagedObjectContext]];
NSError *error = nil;
NSUInteger myEntityCount = [myManagedObjectContext countForFetchRequest:myRequest error:&error];    
[myRequest release];

//
// add another fetch request that fetches all entities for myEntityName -- you fill in the details
// if you don't trigger faults or access properties this should not be too expensive
//
NSArray *myEntities = [...];

//
// sample with replacement, i.e. you may get duplicates
//
srandom(time(NULL)); // seed random number generator, so that you get a reasonably different series of random integers on each execution
NSUInteger numberOfRandomSamples = ...;
NSMutableSet *sampledEntities = [NSMutableSet setWithCapacity:numberOfRandomSamples];
for (NSInteger sampleIndex = 0; sampleIndex < numberOfRandomSamples; sampleIndex++) {
    int randomEntityIndex = random() % myEntityCount; // generates random integer between 0 and myEntityCount-1
    [sampledEntities addObject:[myEntities objectAtIndex:randomEntityIndex]];
}

// do stuff with sampledEntities set

Если вам нужно выполнить выборку без замены, чтобы исключить дубликаты, вы можете создать NSSet of randomEntityIndex NSNumber объектов, вместо простой выборки случайных int s.

В данном случае образец из упорядоченного NSSet , удаляйте объекты NSNumber по мере их извлечения из пакета и уменьшайте myEntityCount для целей выбор случайного объекта NSNumber из набора.

5
ответ дан 3 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: