0

私は学んcoreDataでいて、それは初めてです。上司と従業員の 1 対多の関係(つまり、1 人の上司と多くの従業員) を作成しました。そのため、すべてのボスを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のハイブリッドである新しいクラスによって表されます。このリレーションシップオブジェクト内のオブジェクトを並べ替えてコンテキストを保存すると、データベース内のオブジェクトが並べ替えられ、新しい順序が維持されます。この種の順序付けされた関係は、オブジェクトに自然順序付け属性がない場合に使用される傾向があります。たとえば、順序は、UIでリストを注文するためのユーザー設定を表すだけです。NSArrayNSSet

一方、オブジェクトの1つにコレクションの順序を説明する属性がある場合は、その属性を使用して、を指定することでNSFe​​tchRequestの結果を順序付けることができますSort Descriptors。属性の値は、の結果でオブジェクトが配置される位置を指定しますNSFetchRequest

使用している場合は、その関係と同期Ordered Relationshipsの順序を維持する必要があります。変更がUIから駆動された場合は、などのデリゲートメソッドに応答し、提供された情報を使用して、からのプロキシオブジェクトまたは生成されたコアデータを使用して、対応するオブジェクトをコアデータ関係の新しい位置に移動します生成されたサブクラスのアクセサー。NSOrderedSetUITableViewUITableViewDataSource- (void)moveRowAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndexmutableOrderedSetValueForKey:

順序の変更がデータ側から行われた場合は、UITableViewなどのメソッドを使用して、の行をデータに加えた変更insertRowsAtIndexPaths:withRowAnimation:moveRowAtIndexPath:toIndexPath:同期しUITableViewます。

を使用しているNSFetchRequest場合は、同様のタスクがあります。この場合、オブジェクトの並べ替え属性を更新して、デリゲートUITableViewを介して記述された新しい順序に一致させることにより、ユーザーによる順序の変更に対応します。UITableViewDataSourceまたは、順序の変更がデータ側で開始されている場合は、UITableViewデータの並べ替え属性に加えている変更と一致するように、メソッドを介して更新します。この場合、NSFetchResultsとしての結果を使用することになりNSArrayます。また、次にを実行するまで、そのオブジェクトの同期を維持する必要がありますNSFetchRequest。同じ並べ替え記述子を使用して配列を並べ替えたり、を作成してそのNSMutableArrayメソッドを使用してデータをテーブルに一致するように移動したりできます。

最後に、使用している場合は、それNSFetchRequestを見てみたいと思うかもしれません。それは、ソートされたものとNSFetchedResultsControllerを同期するタスクを単純化することです。ドキュメントには、これに適したサンプルコードがあります。この場合、データの順序が自動的に処理されることがあります。たとえば、テーブルが「割り当て日」(つまり、従業員が上司に割り当てられた日付)で並べ替えられている場合、正しい情報を使用してオブジェクトを作成するだけで、テーブルに正しい結果がトリガーされます。NSFetchRequestUITableView

順序付けられた関係はiCloudでは機能しないことに注意してください。しかし、私の意見では、iCloudはとにかく機能しないので、それは問題ではありません。

于 2012-11-01T09:37:26.310 に答える