0

我正在学习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();
    }
}
4

1 回答 1

1

[更新问题的具体答案]

要么......

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

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

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

我知道这不是那么直观,你不能只制作一个可变副本,你必须从mutableOrderedSetValueForKey.


[原始通用答案]...

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

另一方面,如果您的一个对象上有一个描述集合顺序的属性,那么您可以使用该属性通过指定Sort Descriptors. 该属性的值将指定对象在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通过它的方法更新,以匹配您对数据的排序属性所做的更改。在这种情况下,您将使用NSFetchResultsas 的结果NSArray,您还必须使该对象保持同步,直到您下次运行NSFetchRequest. 您可以使用相同的排序描述符对数组进行排序,或者创建一个NSMutableArray并使用它的方法来移动数据以匹配表。

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

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

于 2012-11-01T09:37:26.310 回答