CoreData — как создать запрос выборки для получения массива случайных значений атрибутов

#objective-c #ios4 #core-data

#objective-c #ios4 #core-данные

Вопрос:

У меня есть простая модель с 2 объектами House и Flat. Дом имеет много общего с квартирой. Flat имеет такие атрибуты, как число и описание.

Я хотел бы получить список случайных восьми плоских чисел.

Я пытаюсь пойти этим путем, но кажется, что «неправильно

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

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

    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];

    NSArray *houses = [aFetchedResultsController fetchedObjects];
  

Затем мне нужно получить соответствующие значения.

Пожалуйста, покажите мне правильный подход.

Я пытаюсь ответить сам. Возможно, мои мозги сухие 🙂 Просто нужно

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

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

У меня есть еще один вопрос, связанный с первым. Как получить случайные объекты, если количество квартир составляет около 10000? В целом это работает, но заметно замедляется.

Ответ №1:

Ограничения сортируют записи случайным образом и устанавливают [fetchRequest setFetchLimit:8]; , чтобы получить первые восемь. Для случайной сортировки создайте NSSortDescriptor с помощью селектора или компаратора, который возвращает NSComparisonResult случайным образом, и добавьте этот дескриптор в запрос выборки.

Комментарии:

1. Спасибо за ответ. Но вы имели в виду [fetchRequest setFetchLimits:8]

2. Упс! Да, я имел в виду setFetchLimit: