【发布时间】:2017-02-03 21:02:50
【问题描述】:
我正在尝试从核心数据中获取结果,以便在加载视图时显示在表视图中。请求确实获取了结果,但在视图加载后立即崩溃。
with reason: '-[__NSArrayI isEqualToString:]: unrecognized selector sent to instance
自从引入 Persistent Container 以来,我找不到任何关于如何使用 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];
}
【问题讨论】:
-
如果你想了解 NSPersistentContainer 看这个讲座:vimeo.com/89370886。这个讲座是从 NSPersistentContainer 存在之前开始的,但仍然非常相关。基本上 NSPersistentContainer 设置了讲座推荐的核心数据堆栈。
-
您需要在调试器中运行您的应用程序并打开异常断点。然后您可以准确地看到您的应用程序崩溃的位置。一旦我们看到应用程序崩溃的代码,我们就可以调试它出错的原因。
-
@DaveWeston 谢谢你,戴夫。我无法在表格视图中显示数据。现在已经解决了。
标签: ios objective-c core-data