我正在尝试从Core Data检索数据并将其放入Mutable Array
我有一个名为'Stock'的实体,在属性中,属性称为:code,price&描述...
如何将存储在这些属性中的数据转换为简单的可变阵列?
我添加了此代码......
NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:[stock valueForKey:@"code"]];
我收到此错误...
'-[NSCFArray insertObject:atIndex:]: attempt to insert nil'
我有一个名为'Stock'的'托管对象类',并声明为stock。我错过了什么吗?
如果我在-cellForRowAtIndexPath
...
Stock *stock1 = [fetchedResultsController objectAtIndexPath:indexPath];
array = [[NSMutableArray alloc] init];
[array addObject:stock1.code];
NSLog(@"Filtered List is? %@", array);
在控制台中,我可以看到这两个项目
'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];
一切都过滤得很好但是当我在搜索上点击取消时,它没有重新加载原始数据......
我不会被击败...... !!
感谢名单
答案 0 :(得分:2)
由于您在-viewDidLoad
中遇到此问题,我猜测(并且没有来自-viewDidLoad
的代码,只是猜测)您正试图从{{1}获取对象在控制器上调用NSFetchedResultsController
之前,你就在nils之中。
我建议您在-executeFetch:
中设置一个断点并观察值,然后浏览代码。这将告诉您什么是-viewDidLoad
以及在哪里。
当然,更好的问题是,您为什么要将nil
个实例放入NSManagedObject
?既然它们已经在你的NSMutableArray
中了,是否真的需要建立另一个阵列?最终目标是什么?
现在我明白你要做什么了。
仅在进行搜索时填充数组。请查看http://developer.apple.com/iphone/library/samplecode/TableSearch/index.html示例代码,您应了解如何将其应用于您的情况。
如果您希望使用预定义的搜索输入表格视图,则需要在NSFetchedResultsController
中执行-performFetch:
后执行此操作。
修改NSFetchedResultsController
上的NSPredicate
以包含您的搜索字词,然后在NSFetchedResultsController
上执行-performFetch:
,您可能需要执行NSFetchedResultsController
桌子也是,我不确定。
当用户清除搜索字段时,您将重置谓词并重新获取所有内容。因为它都是缓存的,所以不应该有性能损失。
解决方案2刚刚发生在我身上,我没有亲自测试过,但没有理由不能正常工作。甚至应该在搜索中为您提供实时更新。
答案 1 :(得分:1)
您是否阅读过文档?您fetch您的Stock实例(所有这些实例或使用谓词过滤它们),然后随意使用它们。
然后,您可以单独将其属性添加到数组中:
[array addObject:[stockInstance valueForKey:@"price"];
...或使用< NSKeyValueCoding>协议方法,如-dictionaryWithValuesForKeys:
NSDictionary方法,如-objectsForKeys:notFoundMarker:
,以获取给定键的数组。
但这实际上可能是你需要做的,也可能不是。这取决于您打算使用生成的数组。例如,如果要快速求和所有匹配的Stock实例的“价格”值,可以使用Set and Array Operators。这实际上取决于你想要实现的目标。
答案 2 :(得分:1)
当我收到你的错误时,
'-[NSCFArray insertObject:atIndex:]: attempt to insert nil'
我给fetchedRequest一个有nil键的排序描述符。当我使用这些行时出现错误:
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];