【问题标题】:Core Data: Fetch all children in a 1 to many relationship核心数据:获取一对多关系中的所有孩子
【发布时间】:2015-11-30 21:16:38
【问题描述】:

我有一对多的关系,并且我成功地将数据放入其中。问题是我无法通过关系属性获取它。

我的添加代码:

   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];

【问题讨论】:

    标签: ios iphone ipad core-data nsfetchrequest


    【解决方案1】:

    您的orders 关系与UnsyncedOrders特定实例 相关。但是,当您尝试执行 fetch 时,您会这样做:

    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 关系的值即可。

    【讨论】:

    • 我获取了您的基本代码并输入了它,但现在我获取了您的基本代码并添加了但现在由于未捕获的异常“NSInvalidArgumentException”,我得到了终止应用程序,原因:'to-many key not此处允许' *** 首先抛出调用堆栈
    • NSEntityDescription *parent = [NSEntityDescription entityForName:@"UnsyncedOrders" inManagedObjectContext:context]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"items == %@", parent];
    • [请求集合谓词:谓词]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"arrayKey" 升序:YES]; [请求 setSortDescriptors:@[sortDescriptor]]; [请求集合实体:父]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; NSError *error = nil;
    • 我引用了你的代码。您不应该从我的答案中复制代码,因为该代码直接来自您的问题。
    【解决方案2】:

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

    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];
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多