2017-02-03 147 views
0

我试图从核心数据中提取结果以在视图加载时显示在表视图中。请求确实获取结果,但在视图加载后立即崩溃。获取结果崩溃(使用persistentContainer) - 核心数据目标C

与理由:“ - [__ NSArrayI isEqualToString:]:发送到实例

自从引入永久集装箱无法识别的选择,我找不到任何有关如何使用Objective C.

使用它的任何引用

我有一个简单的核心数据模型, 实体 - '项目' 与属性 - '姓名'

// // 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); 
} 

抓取结果

- (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

如果您想了解NSPersistentContainer,请观看本讲座:https://vimeo.com/89370886。本次讲座来自NSPersistentContainer之前,但仍然非常相关。基本上NSPersistentContainer设置了演讲推荐的核心数据栈。 –

+0

您需要在调试器中运行您的应用程序并打开异常断点。然后你就可以看到你的应用崩溃的确切位置。一旦我们看到应用程序崩溃的代码,我们可以调试它出错的原因。 –

+0

@DaveWeston谢谢你戴夫。我无法在表格视图中显示数据。现在解决了。 – 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方法中,logging resultListArray在输出控制台中给出了完整的数组项目。 – Rajxelton

+0

我继续并在numberOfRows方法内将if(resultListArray)替换为if([resultListArray count]!= 0)。应用程序没有运行,但没有在表格视图中显示任何列表 – Rajxelton

+0

@Rajxelton我不确定为什么你有两个数组,listArray和resultListArray,但我怀疑突出的问题是你在某个地方使用了错误的数组。 – pbasdf