2015-09-04 97 views
0

我有一对多的关系,我成功地将数据放入其中。问题是我无法通过关系属性获取它。核心数据:以一对多的关系获取所有的孩子

我添加代码:

NSManagedObjectContext *context = [[CBICoreDataController sharedInstance] masterManagedObjectContext]; 
NSManagedObject *orders = [NSEntityDescription 
          insertNewObjectForEntityForName:@"UnsyncedOrders" 
          inManagedObjectContext:context]; 
    [orders setValue:[dictionary valueForKey:@"specialInstructions"] forKey:@"specialInstructions"]; 
[orders setValue:[dictionary valueForKey:@"poNumber"] forKey:@"poNumber"]; 
[orders setValue:[dictionary valueForKey:@"specialInstructions"] forKey:@"specialInstructions"]; 
[orders setValue:[dictionary valueForKey:@"deliveryDate"] forKey:@"deliveryDate"]; 
[orders setValue:[dictionary valueForKey:@"account"] forKey:@"account"]; 

NSMutableSet *muteSet=[orders mutableSetValueForKey:@"items"]; 

for (NSDictionary *dict in [dictionary valueForKey:@"items"]) { 
    NSManagedObject *items = [NSEntityDescription 
           insertNewObjectForEntityForName:@"UnsyncedOrderItems" 
           inManagedObjectContext:context]; 
    [items setValue:[dict valueForKey:@"arraykey"] forKey:@"arrayKey"]; 
    //Other Sets Here 

    [muteSet addObject:items]; 
} 

[orders setValue:muteSet forKey:@"items"]; 

    NSError *error; 
    if (![context save:&error]) { 
     NSLog(@"Error saving in writeToMenuCostingDetailsTable: %@", [error localizedDescription]); 
    } 

我有什么对现在的获取,但它不工作:

NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"arrayKey" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSEntityDescription *parent = [NSEntityDescription entityForName:@"UnsyncedOrders" 
      inManagedObjectContext:context]; 

NSEntityDescription *child = [NSEntityDescription entityForName:@"UnsyncedOrderItems" 
      inManagedObjectContext:context]; 


[fetchRequest setEntity:child]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"orders == %@", parent]; 
[fetchRequest setPredicate:predicate]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 

NSError *error; 

[aFetchedResultsController performFetch:&error]; 
NSArray *fetchedObjects = [aFetchedResultsController fetchedObjects]; 

enter image description here

回答

0

orders关系涉及到的特定实例UnsyncedOrders。然而,当您尝试执行取回,你这样做:

NSEntityDescription *parent = [NSEntityDescription entityForName:@"UnsyncedOrders" 
     inManagedObjectContext:context]; 
[...] 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"orders == %@", parent]; 
[fetchRequest setPredicate:predicate]; 

你试图获取实例,其中orders关系指向UnsyncedOrders实体本身,而不是那些涉及到UnsyncedOrders特定的实例。这总是会失败。实际上,如果您正在检查performFetch:的结果,那么它很可能会返回NO并为您提供某种错误来描述问题。

如果您想要获取与UnsyncedOrders的特定实例相关的UnsyncedOrderItems,则需要使用引用特定实例的谓词。但是,如果您已经拥有该实例,则不需要获取 - 只需向UnsyncedOrders实例询问其items关系的值即可。

+0

我把你的基本代码和输入的,但现在我得到我把你的基本代码,并添加上,但现在我得到因未捕获的异常终止应用程序'NSInvalidArgumentException',原因:'对多密钥不允许在这里' ***第一次抛出调用堆栈 – user1079052

+0

NSEntityDescription * parent = [NSEntityDescription entityForName:@“UnsyncedOrders” inManagedObjectContext:context]; NSFetchRequest * request = [[NSFetchRequest alloc] init]; NSPredicate * predicate = [NSPredicate predicateWithFormat:@“items ==%@”,parent]; – user1079052

+0

[request setPredicate:predicate];NSSortDescriptor * sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@“arrayKey”ascending:YES]; [request setSortDescriptors:@ [sortDescriptor]]; [request setEntity:parent]; NSFetchedResultsController * aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; NSError * error = nil; – user1079052

0

这是我最终使用的解决方案:

NSManagedObjectContext *context = [[CBICoreDataController sharedInstance] masterManagedObjectContext]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UnsyncedOrders" 
              inManagedObjectContext:context]; 
NSError *error = nil; 
[fetchRequest setEntity:entity]; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 
for (UnsyncedOrders *info in fetchedObjects) { 
    [mutableArray addObject:info.items]; 
}