如何将核心数据中的属性获取到iPhone SDK的数组中

如何将核心数据中的属性获取到iPhone SDK的数组中,iphone,core-data,Iphone,Core Data,我试图从核心数据中检索数据,并将其放入可变数组中 我有一个名为“股票”的实体,在属性中,属性名为:代码、价格和描述 如何将存储在这些属性中的数据放入一个简单的可变数组中 我已经添加了这个代码 NSMutableArray *array = [[NSMutableArray alloc]init]; [array addObject:[stock valueForKey:@"code"]]; 我得到了这个错误 '-[NSCFArray insertObject:atIndex:]: attem

我试图从核心数据中检索数据,并将其放入可变数组中

我有一个名为“股票”的实体,在属性中,属性名为:代码、价格和描述

如何将存储在这些属性中的数据放入一个简单的可变数组中


我已经添加了这个代码

NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:[stock valueForKey:@"code"]];
我得到了这个错误

'-[NSCFArray insertObject:atIndex:]: attempt to insert nil' 
我有一个名为“Stock”的“托管对象类”,并声明为Stock。我错过什么了吗


如果我在
-cellforrowatinexpath
中执行此操作

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
方法中设置的数组中?就像它在
-cellforrowatinexpath
中那样

更新 嗨,马库斯

终于让它起作用了(嗯,80%)

我把它放在
-cellforrowatinexpath

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你看过文档了吗?您可以创建您的股票实例(所有这些实例或使用谓词过滤它们),然后随意处理它们

然后,可以将其属性分别添加到数组中:

[array addObject:[stockInstance valueForKey:@"price"];
。。。或者使用协议方法的组合,例如
-dictionaryWithValuesForKeys:
NSDictionary方法,例如
-objectsForKeys:notFoundMarker:
,以获取给定密钥的数组


不过,这可能是,也可能不是你真正需要做的。这取决于您打算将结果数组用于什么。例如,如果需要所有匹配股票实例的“价格”值的快速总和,可以使用。这真的取决于你想要实现什么。

你看过文档了吗?您可以创建您的股票实例(所有这些实例或使用谓词过滤它们),然后随意处理它们

然后,可以将其属性分别添加到数组中:

[array addObject:[stockInstance valueForKey:@"price"];
。。。或者使用协议方法的组合,例如
-dictionaryWithValuesForKeys:
NSDictionary方法,例如
-objectsForKeys:notFoundMarker:
,以获取给定密钥的数组


不过,这可能是,也可能不是你真正需要做的。这取决于您打算将结果数组用于什么。例如,如果需要所有匹配股票实例的“价格”值的快速总和,可以使用。这实际上取决于您试图实现的目标。

由于您的
-viewDidLoad
中存在此问题,我在猜测(如果没有
-viewDidLoad
中的代码,这只是猜测)在控制器上调用
-executeFetch:
之前,您正在尝试从
NSFetchedResultsController
获取对象,因此您处于零的状态

我建议在
-viewDidLoad
中设置一个断点,观察值,然后遍历代码。这将告诉您什么是
nil
以及在哪里

当然,更好的问题是,为什么要将
NSManagedObject
实例放入
NSMutableArray
?因为它们已经在您的
NSFetchedResultsController
中,所以确实需要构建另一个数组吗?最终目标是什么

更新 现在我明白你想做什么了

解决方案1 仅在执行搜索时填充数组。看一下示例代码,您应该了解如何将其应用于您的情况

如果要使用预定义的搜索输入表视图,则需要在执行
NSFetchedResultsController
中的
-performFetch:
后执行该操作

解决方案2 修改
NSFetchedResultsController
上的
NSPredicate
以包含搜索词,然后在
NSFetchedResultsController
上执行
-performFetch:
,您可能还必须在表上执行
-reloadData
,我不确定

当用户清除搜索字段时,重置谓词并重新获取所有内容。因为它都是缓存的,所以不应该有性能损失


解决方案2刚刚出现在我的脑海中,我还没有亲自测试过它,但没有理由它不能正常工作。甚至应该在搜索中为您提供实时更新。

由于您的
-viewdiload
中存在此问题,我猜(如果没有
-viewdiload
中的代码,这只是一个猜测)在控制器上调用
-executeFetch:
之前,您正在尝试从
NSFetchedResultsController
获取对象,因此您处于零的状态

我建议在
-viewDidLoad
中设置一个断点,观察值,然后遍历代码。这将告诉您什么是
nil
以及在哪里

当然,更好的问题是,为什么要将
NSManagedObject
实例放入
NSMutableArray
?因为它们已经在您的
NSFetchedResultsController
中,所以确实需要构建另一个数组吗?最终目标是什么

更新 现在我明白你想做什么了

解决方案1 仅在执行搜索时填充数组。看一下示例代码,您应该了解如何将其应用于您的情况

如果要使用预定义的搜索输入表视图,则需要在执行
NSFetchedResultsController
中的
-performFetch:
后执行该操作

解决方案2 修改
NSFetchedResultsController
上的
NSPredicate
以包含搜索词,然后在
NSFetchedResultsController
上执行
-performFetch:
,您可以
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending:NO];   
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];