Как я могу получить атрибуты из базовых данных в массив для - iPhone SDK - PullRequest
0 голосов
/ 27 февраля 2010

Я пытаюсь извлечь данные из Core Data и поместить их в изменяемый массив

У меня есть сущность с именем Stock, а в свойствах - атрибуты: код, цена и описание ...

Как получить данные, хранящиеся в этих атрибутах, в простой изменяемый массив?


Я добавил этот код ...

NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:[stock valueForKey:@"code"]];

и я получаю эту ошибку ...

'-[NSCFArray insertObject:atIndex:]: attempt to insert nil' 

У меня есть «Класс управляемых объектов», называемый «Запас», и объявленный как «Запас». Я что-то упустил?


Если я сделаю это в -cellForRowAtIndexPath ...

Stock   *stock1  = [fetchedResultsController objectAtIndexPath:indexPath];

array = [[NSMutableArray alloc] init];
[array addObject:stock1.code];

NSLog(@"Filtered List is? %@", array);

В консоли я вижу эти 2 пункта

'The Filtered array is 810005'
'The Filtered array is 810007

Что я должен сделать, чтобы получить эти элементы (810005 и 810007) в массив, настроенный методом -viewDidLoad? Как это происходит в -cellForRowAtIndexPath?

Обновление

Привет, Маркус,

Наконец-то все заработало (ну, 80%)

Я положил это в -cellForRowAtIndexPath

Stock *product = nil;
if (tableView == self.searchDisplayController.searchResultsTableView)
{   

    filteredListContent = [NSMutableArray arrayWithObjects:stock1.code, nil];

    product = [self.filteredListContent objectAtIndex:indexPath.row];

    [self configureFilteredCell:cell atIndexPath:indexPath];

    [filteredListContent objectAtIndex:indexPath.row];
    NSLog(@"Filtered List Array List is? %@", stock1.code);
}
else 
{
    listContent = [NSMutableArray arrayWithObjects:stock1.code, nil];
    [self configureCell:cell atIndexPath:indexPath];

    NSLog(@"List Array List is?          %@", stock1.code);
}

Тогда я использовал этот код в области видимости

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    self.savedSearchTerm = searchText;

    if (searchText !=nil)
    {
        NSPredicate *predicate =[NSPredicate predicateWithFormat:@"code beginsWith[cd] %@", searchText];
        [fetchedResultsController.fetchRequest setPredicate:predicate];

    }
    else
    {
        NSPredicate *predicate =[NSPredicate predicateWithFormat:@"code contains[cd] %@", searchText];
        [fetchedResultsController.fetchRequest setPredicate:predicate];
        [self.tableView reloadData];
    }

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error])
    {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }           

    [self.tableView reloadData];

Все фильтруется нормально, но когда я нажимаю "Отмена" при поиске, исходные данные не перезагружаются ...

Я не буду побежден ... !!

Thanx

Ответы [ 3 ]

2 голосов
/ 28 февраля 2010

Поскольку у вас есть эта проблема в вашем -viewDidLoad, я предполагаю (и без кода из -viewDidLoad, это только предположение), что вы пытаетесь получить объекты из NSFetchedResultsController до -executeFetch: был вызван на контроллере, и поэтому вы находитесь на земле нилса.

Я бы предложил установить точку останова в вашем -viewDidLoad, посмотреть значения и пройтись по своему коду. Это скажет вам, что nil и где.

Конечно, лучший вопрос: почему вы пытаетесь поместить NSManagedObject экземпляров в NSMutableArray? Поскольку они уже есть в вашем NSFetchedResultsController, действительно ли нужно создавать другой массив? Какова конечная цель?

Обновление

Теперь я понимаю, что вы пытаетесь сделать.

Решение 1

Заполняйте массив только после проведения поиска. Взгляните на пример кода http://developer.apple.com/iphone/library/samplecode/TableSearch/index.html и узнайте, как применить его к вашей ситуации.

Если вы хотите ввести табличное представление с предопределенным поиском, то вам нужно выполнить его после того, как вы выполнили -performFetch: в NSFetchedResultsController.

Решение 2

Измените NSPredicate на NSFetchedResultsController, чтобы включить в него условия поиска, а затем выполните -performFetch: на NSFetchedResultsController, возможно, вам также придется сделать -reloadData для таблицы, я не уверен.

Когда пользователь очищает поле поиска, вы сбрасываете предикат и заново выбираете все. Поскольку все это кэшируется, не должно быть снижения производительности.

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

1 голос
/ 08 июля 2010

Когда я получил вашу ошибку,

'-[NSCFArray insertObject:atIndex:]: attempt to insert nil'

Я дал fetchedRequest дескриптор сортировки с нулевым ключом. Ошибка появилась, когда я использовал эти строки:

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

Ошибка исчезла, когда я установил ключ на @ "name":

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
1 голос
/ 27 февраля 2010

Вы читали документацию? Вы извлекаете свои экземпляры Stock (все из них или фильтруете их с помощью предиката), а затем делаете с ними все, что пожелаете.

Затем вы можете добавить их свойства в массив по отдельности:

[array addObject:[stockInstance valueForKey:@"price"];

... или используйте комбинацию методов протокола , таких как -dictionaryWithValuesForKeys: Методы NSDictionary, такие как -objectsForKeys:notFoundMarker:, чтобы получить массив для данных ключей.

Хотя это может или не может быть тем, что вам нужно сделать. Это зависит от того, для чего вы собираетесь использовать полученный массив. Например, если вам нужна быстрая сумма всех подходящих значений «цены» экземпляров Stock, вы можете использовать Операторы Set и Array . Это действительно зависит от того, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...