从我正在阅读的内容来看,我怀疑这比您想象的要容易得多。
在我看来,您已经设想在您的 UITableController 的 tableView:cellForRowAtIndexPath: 方法中使用字典数据结构,而您可能根本不需要使用它。
当您表视图控制器实例化时,(viewDidLoad: 可能是最合适的地方)只需使用如下代码检索您的资产:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Asset" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// handle errors here
}
[fetchRequest release];
如有必要,将 fetchedObjects 数组分配给 NSArray 类型的实例变量,以便您可以在管理表的 UITableViewController 类中的多个位置引用它。然后在上面的代码之后,您可以执行以下操作:
self.assets = fetchedObjects;
如果您还没有为资产 NSManagedObject 创建自定义子类,那么数组中的每个对象都是 NSManagedObject 类型,您需要将其读入该类型的变量中。
当您需要与资产相关的所有物列表时,它已经存在于数组中的每个资产对象中(这就是 CoreData 的美妙之处,如果它实际上没有在内存中实例化,那么当您尝试访问该属性时,CoreData 将自动为你实例化它)。
因此,假设您尚未为 NSManagedObject 定义自定义类,那么您的数组对象将属于该类型。将数组中的一个资产对象分配给一个名为(适当地)资产的局部变量,
例如,这会将索引 0 处的对象分配给局部变量。
NSManagedObject *asset = [self.assets objectAtIndex:0];
您可以使用以下代码获得您的财产:
NSSet *assetPossessions = [asset valueForKey:"@possessions"];
(假设在 xCode 的模型编辑器中定义的关系已被命名为“拥有”)
或者,如果您为 Asset NSManagedObject 生成了自己的自定义子类,那么这可能是一个更好的示例:
MyManagedAssetObject *asset = [self.assets objectAtIndex:0];
NSSet *assetPossessions = asset.possessions;
注意在这个例子中,我假设你没有使用 NSFetchedResultsController。实际上,使用一个表来管理一个表甚至更容易,但是就像编程的情况一样,只有当你知道“只做一件事”并且(矛盾地)使答案复杂化时,它才会变得更容易。既然你没有提到它,我假设你没有使用它。
希望这可以帮助。保罗