我有一个有多个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]);
返回的项目数为零。
我完全难过,花了几个小时在网上搜索,尝试不同的事情,我无法弄清楚。我知道那里有一些更聪明的编码器,我希望你们中的一个能看出问题所在。
答案 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并且它有效!