从多个TableVIews保存核心数据

时间:2011-06-01 15:26:57

标签: iphone cocoa-touch uitableview core-data

我有一个有多个tableviews的应用程序,我想使用Core Data来捕获所有数据。我有两个实体 - 冰柜和物品。在第一个tableview中,我添加了一个冰箱,它可以正确保存。我退出了应用程序,重新打开,它就在那里。我点击冰箱(打开另一个tableview)并添加一些项目,我可以在我的新分段tableview中看到它们。我退出了我的应用程序,重新启动它,看到冰箱,点击它,没有物品。

我的appDelegate中有我的managedObjectContext,并使用所有视图从那里引用它,所以我没有创建多个实例。这是我用来将项目保存到冰箱的代码,包括managedObjectContext和my ItemsArray:

Item *item = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]];
    [item setFreezer:freezerName];
    [item setName:name];
    [item setQuantity:quantity];
    [item setSection:section];
    [item setAdded:added];
    [item setNotes:notes];

    NSError *error = nil;
    if (![[delegate managedObjectContext] save:&error]) {
        NSLog(@"Freezer info didn't save.  Need to handle this.");
    }

    [items insertObject:item atIndex:0];

以下是我在ItemViewController中使用的代码,用于检索viewDidLoad中的项目:

 NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer == '%@'", freezerName];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]];
    NSSortDescriptor *sorts = [[NSSortDescriptor alloc] initWithKey:@"section" ascending:NO];
    NSArray *sort = [[NSArray alloc] initWithObjects:sorts, nil];

    [request setSortDescriptors:sort];
    [request setEntity:entity];
    [request setPredicate:predicate];

    NSError *error = nil;

    NSMutableArray *results = [[[delegate managedObjectContext] executeFetchRequest:request error:&error] mutableCopy];
    if(results == nil) {
        NSLog(@"Error fetching results... need to handle");
    }

    [self setItems:results];

    NSLog(@"items count:%d", [items count]);

返回的项目数为零。

我完全难过,花了几个小时在网上搜索,尝试不同的事情,我无法弄清楚。我知道那里有一些更聪明的编码器,我希望你们中的一个能看出问题所在。

3 个答案:

答案 0 :(得分:0)

我会尝试将谓词更改为

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer like %@", freezerName];

希望有所帮助!

答案 1 :(得分:0)

问题可能是您在

中加载数据
- viewDidLoad:

方法。加载视图时只调用一次,因此当底层数据被更改时,视图控制器就不会知道它。

您可以将加载代码移至

- viewWillAppear:

方法或引入通知以传播数据存储已更改其状态的信息,并在该事件上重新加载表视图。

最好的方法可能是使用NSFetchedResultsController作为您的数据源,因为它始终了解其数据存储更改。检查文档以获取对该类的引用。

答案 2 :(得分:0)

所以我的数据正确保存 - 我在评论谓词后看到了它。所以我的谓词的语法是错误的。我做了一些搜索,发现这篇文章对我有用:

Querying Core Data with Predicates - iPhone

我用contains [cd]替换了LIKE并且它有效!