2017-02-03 1 views
0

Я пытаюсь получить результаты из основных данных для отображения в виде таблицы всякий раз, когда представление загружается. Запрос извлекает результат, но падает, как только загружается вид.Извлечение результатов сбоев (с использованием persistentContainer) - Объект основных данных C

с разумом: «- [__ NSArrayI isEqualToString]: непризнанный селектор направлен например

С введением стойкого контейнера, я не мог найти какие-либо ссылки о том, как использовать его с помощью Objective C.

Я простая модель основных данных, Entity - 'Item' с атрибутом - 'имя'

// ViewController.m //

@interface ViewController() 
{ 
NSMutableArray *listArray; 
AppDelegate *delegate; 
NSManagedObjectContext *context; 
NSMutableArray *resultListArray; 
} 
@end 

- (void)viewDidLoad { 
[super viewDidLoad]; 
listArray = [[NSMutableArray alloc]init]; 
resultListArray = [[NSMutableArray alloc]init]; 
[self fetchItems]; 
} 
Источник

TableView данных

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return [listArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

if (resultListArray) { 
    cell.textLabel.text = [resultListArray objectAtIndex:indexPath.row]; 
} 

cell.textLabel.text = [listArray objectAtIndex:indexPath.row]; 
return cell; 
} 

Получить Управляемый контекст

- (NSManagedObjectContext *)managedObjectContext { 

delegate = (AppDelegate*)[[UIApplication sharedApplication]delegate]; 
context = [[delegate persistentContainer]viewContext]; 

NSLog(@"ManagedContext Created Successfully"); 

return context; 
} 

Сохранить в основных данных

- (void) saveItemMethod:(NSString*)name { 

context = [self managedObjectContext]; 

NSManagedObject *task = [[Item alloc]initWithContext:context]; 

[task setValue:name forKey:@"name"]; 

NSString *itemString = [task valueForKey:@"name"]; 

[listArray addObject:itemString]; 

[delegate saveContext]; 

NSLog(@"Save successful"); 
NSLog(@"%@", listArray); 
} 

Fetch результаты

- (void) fetchItems { 

context = [self managedObjectContext]; 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; 
// request.resultType = NSDictionaryResultType; 

NSError *error = nil; 
NSManagedObject *result = (NSManagedObject*)[context executeFetchRequest:request error:&error]; 

NSString *resultString = [result valueForKey:@"name"]; 

[resultListArray addObject:resultString]; 

NSLog(@"Fetch successful"); 
NSLog(@"%@", resultListArray); 

[self.tableView reloadData]; 
} 
+0

Если вы хотите понять NSPsistentContainer, посмотрите эту лекцию: https://vimeo.com/89370886. Эта лекция проходит до того, как NSPsistentContainer существовал, но все еще очень уместен. В основном NSPersistentContainer настраивает стек основных данных, который рекомендует лекция. –

+0

Вам нужно запустить приложение в отладчике и включить контрольные точки исключения. Затем вы можете увидеть, где именно ваше приложение рушится. Когда мы увидим код, в котором приложение разбивается, мы можем отладить, почему это происходит неправильно. –

+0

@DaveWeston спасибо dave. У меня возникли проблемы с отображением данных в виде таблицы. теперь он разрешен. – Rajxelton

ответ

1

сообщение об ошибке указывает на то, что isEqualToString: метод вызывается на объект NSArray - который, очевидно, не работает (isEqualToString: - метод NSString).

Итак, ваш код обрабатывает массив, как будто это строка. Корень проблемы лежит здесь, в fetchItems код:

NSManagedObject *result = (NSManagedObject*)[context executeFetchRequest:request error:&error]; 
NSString *resultString = [result valueForKey:@"name"]; 
[resultListArray addObject:resultString]; 

первая линия является неправильным: executeFetchRequest возвращает массив NSManagedObjects (даже если есть только один объект в массиве). Поэтому вы можете просто использовать:

NSArray *result = [context executeFetchRequest:request error:&error]; 
self.resultListArray = [[result valueForKey:@"name"] mutableCopy]; 
+0

Благодарим вас за ответ. Я пробовал это раньше и еще раз. по-прежнему падает с ошибкой: *** - [__ NSArrayM objectAtIndex:]: индекс 0 за пределами для пустого массива ', показывая, что массив пуст. но в способе fetchItems, результат регистрацииListArray предоставляет полный массив элементов в выходной консоли. – Rajxelton

+0

i перешел и заменил if (resultListArray) на if ([resultListArray count]! = 0) внутри метода numberOfRows. приложение запустило, но не отобразило какой-либо список в виде таблицы. – Rajxelton

+0

@ Rajxelton Я не уверен, почему у вас есть два массива, listArray и resultListArray, но я подозреваю, что выдающаяся проблема заключается в том, что вы где-то используете что-то не так. – pbasdf

Смежные вопросы