NSFetchResultsController w / NSPredicate(关系)与基本NSFetchRequest(包含Pic)

时间:2011-03-16 03:09:17

标签: iphone cocoa core-data nsfetchedresultscontroller nspredicate

这是我正在辩论的关系的图像: Core Data Setup

我有一个UIScrollView设置作为水平滚动条,在3个不同的UIViewControllers之间滚动(当然包含UITableView和所需的委托方法等)。

UIScrollView中的每个ViewController都会加载特定 MyObjectType 的UITableView。 (例如,ViewController1加载所有 MyObjects 的表视图,其类型 == MyObjectType.name

这有意义吗?你会注意到我在对象之间设置了反比关系。 MyObjectType 可以包含许多 MyObject ,但 MyObject 只能有一个与其关联的 MyObjectType 。< / p>

当我第一次加载其中一个UIScrollView viewController时,我需要确定这个UITableView的用途是什么 MyObjectType 。我有这个工作正常,我相应地设置表头。

E.g。 [type valueForKey:@"name"] 其中 type MyObjectType 的获取结果NSManagedObject。

我想知道的是,当我获得 MyObjectType 的NSManagedObject时,我还无法访问我可以使用的NSSet *数组(即。[type valueForKey:@"objects"]) UITableView的数据源?如果我添加删除一个对象后我保存 managedContext然后我总是 [tableView reloadData]

我猜这会起作用,只要我不需要UITableView内容动态更改和更新,因为添加了此类型的新 MyObject ?为此,我们需要一个NSFetchedResultsController吗?

以下是将 ALL MyObject加载到UITableView(可行)的代码:

- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"MyObject" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
                          initWithKey:@"creationDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:@"transientSectionDate" 
                                               cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return _fetchedResultsController;    

}

有人可以非常友好地向我展示我需要正确加载的 NSPredicate 声明吗 MyObject的 MyObjectType.name = = @“XXXXXX”?假设我已经将一个 MyObjectType.name 存储在ViewController中保留的NSString中。

提前致谢!

1 个答案:

答案 0 :(得分:0)

谓词格式字符串为:

@"ALL type.name=%@", typeName

但是,由于您确实拥有特定的MyObjectType对象,因此您已经可以直接访问所需的MyObject对象,而不必浪费时间尝试获取它们。只需将该集转换为已排序的数组即可。

要在表处于活动状态时了解正在进行的更改,请在tableview数据源对象中实现observeValueForKeyPath:ofObject:change:context:。然后将addObserver:forKeyPath:options:context:发送到该特定的MyObjectType对象,如下所示:

[anObjectType addObserver:self 
               forKeyPath:@"objects" 
                  options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) 
                  context:nil];

现在,只要该特定MyObjectType的objects值发生更改,就会通知tableview的数据源并可以更改该表。

有关详细信息,请参阅Key-Value Observing Programming Guide