如何从Core Data获取属性到 - iPhone SDK的数组

时间:2010-02-27 20:48:05

标签: iphone core-data

我正在尝试从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];

一切都过滤得很好但是当我在搜索上点击取消时,它没有重新加载原始数据......

我不会被击败...... !!

感谢名单

3 个答案:

答案 0 :(得分:2)

由于您在-viewDidLoad中遇到此问题,我猜测(并且没有来自-viewDidLoad的代码,只是猜测)您正试图从{{1}获取对象在控制器上调用NSFetchedResultsController之前,你就在nils之中。

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

当然,更好的问题是,您为什么要将nil个实例放入NSManagedObject?既然它们已经在你的NSMutableArray中了,是否真的需要建立另一个阵列?最终目标是什么?

更新

现在我明白你要做什么了。

解决方案1 ​​

仅在进行搜索时填充数组。请查看http://developer.apple.com/iphone/library/samplecode/TableSearch/index.html示例代码,您应了解如何将其应用于您的情况。

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

解决方案2

修改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];