【问题标题】:How to perform reodering of cells in One-to-many relationship in CoreData如何在Core Data中以一对多关系对单元格进行重新排序
【发布时间】:2012-10-31 10:32:17
【问题描述】:

我正在学习coreData,我是新手,我创建了老板和员工的一对多关系(即一个老板和多个员工)。所以我在firstTableView 上显示所有老板,当用户点击单元格时,他可以查看分配给每个老板的员工,也可以将员工添加到任何特定老板。 现在我想重新排序老板单元。那应该怎么做呢?

根据下面的讨论编辑

   - (void)insertNewObject:(NSString *)fileName
{    
    Boss *bossName = [NSEntityDescription insertNewObjectForEntityForName:@"Boss" inManagedObjectContext:self.managedObjectContext];

    [bossName setName:fileName];

    NSManagedObject *lastObject = [self.controller.fetchedObjects lastObject];
    float lastObjectDisplayOrder = [[lastObject valueForKey:@"displayOrder"] floatValue];
    NSLog(@"%f",lastObjectDisplayOrder);
    [bossName setValue:[NSNumber numberWithDouble:lastObjectDisplayOrder + 1.0] forKey:@"displayOrder"];

    // Save the context.
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

【问题讨论】:

  • 谁能在这方面帮助我

标签: ios ios5 core-data nsorderedset


【解决方案1】:

[更新问题的具体答案]

要么是……。

[self.boss insertObject:newEmployeeObject inEmployeesAtIndex:0];

如果您选择从您的模型创建子类,那么这是您的 Boss 子类的一部分的核心数据生成方法。或者……

NSMutableOrderedSet *employees = [self.boss mutableOrderedSetValueForKey:@"employees"];
[employees insertObject:newEmployee atIndex:0]

我知道这不是那么直观,你不能只制作一个可变副本,你必须从mutableOrderedSetValueForKey 获取一个特殊的代理对象。


[原始的一般答案]...

Core-data 现在能够使用您可以在模型中指定的“有序关系”。如果这样做,对象模型中的关系将由一个新类NSOrderedSet 表示,它是NSArrayNSSet 的混合体。通过重新排序此关系对象中的对象并保存上下文,您将重新排序数据库中的对象并且它们将保持其新顺序。当对象没有自然排序属性时,往往会使用这种有序关系。例如,订单仅表示用户对在 UI 中排序列表的偏好。

另一方面,如果您的一个对象上有一个描述集合顺序的属性,那么您可以使用该属性通过指定Sort Descriptors 来对 NSFetchRequest 的结果进行排序。该属性的值将指定对象在NSFetchRequest 的结果中的位置。

如果您使用的是Ordered Relationships,则需要保持该关系的NSOrderedSet 的顺序和UITableView 的顺序同步。如果更改是从 UI 驱动的,那么您响应 UITableViewDataSource 委托方法,例如 - (void)moveRowAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex 并使用提供的信息将相应的对象移动到核心数据关系中的新位置,或者使用来自的代理对象mutableOrderedSetValueForKey: 或生成的子类的核心数据生成访问器。

如果订单更改是从数据端驱动的,您将使用UITableView 上的方法,例如insertRowsAtIndexPaths:withRowAnimation:moveRowAtIndexPath:toIndexPath:,将UITableView 中的行与您在数据中所做的更改同步.

如果您使用NSFetchRequests,您有类似的任务。在这种情况下,您通过更新对象上的排序属性以匹配UITableView 通过UITableViewDataSource 委托描述的新顺序来响应用户驱动的顺序更改。或者,如果排序更改从数据端开始,您可以通过它的方法更新UITableView,以匹配您对数据排序属性所做的更改。在这种情况下,您将使用来自NSFetchResults 的结果作为NSArray,您还必须保持该对象同步,直到您下次运行NSFetchRequest。您可以使用相同的排序描述符对数组进行排序,或者创建一个NSMutableArray 并使用它的方法来移动数据以匹配表格。

最后,如果您使用NSFetchRequest,您可能希望查看NSFetchedResultsController,它的工作是简化同步排序的NSFetchRequestUITableView 的任务。文档中有很好的示例代码。在这种情况下,您可能会发现数据的排序会自行处理。例如,假设您的表格按“分配日期”(即员工被分配给老板的日期)排序,那么只需使用正确的信息创建对象就会在表格中触发正确的结果。

请注意,有序关系不适用于 iCloud。但是在我看来,iCloud 无论如何都不起作用,所以这不是问题。

【讨论】:

  • 嘿,谢谢您的回复,实际上我有一个添加老板和分配给他的员工使用添加按钮。我希望新老板和添加的员工应始终位于表中的第一位。我知道我必须使用 insertObject:atIndex 函数,但是在哪个方法中。请回复
  • 已编辑答案以描述有关在核心数据中排序数据和同步表中的顺序的更多信息。请注意,表和它的数据源必须匹配,因此说它必须在表中排在第一位与说它必须在数据源中排在第一位是一样的(即,当表格请求单元格时返回的单元格第一行)如何使数据源保持同步取决于数据源(上面描述的两个常见选项),您使用编辑后的答案中提到的方法使表保持同步。请记住,表和数据源必须匹配,否则会出错。
  • 请检查我在上面创建员工对象的地方添加了代码,所以如果我必须对 NSOrderedSet 进行更改,是否应该在这里完成,请检查上面的代码
  • 那么表格首先是如何得到它的顺序的呢?
  • 谢谢你的回复,我是否应该在insertObject函数中写这个?
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多