2012-10-31 51 views
0

在一個一對多的關係進行細胞reodering我學習coreData,我新,我已經創建了一個一個一對多的老闆和員工,(即一個老闆的關係,許多員工)。所以我在firstTableView上顯示了所有老闆,當用戶點擊單元格時,他可以查看分配給每個老闆的員工,還可以將員工添加到任何特定的老闆。 現在我想重新排序老大牢房。那麼應該怎麼做呢?如何CoreData

基於以下

- (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(); 
    } 
} 
+0

任何人都可以幫助我在這方面 – Ranjit

回答

1

討論[具體回答問題更新]

這將是要麼編輯....

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

這是一個核心 - 數據生成方法,如果您選擇從模型創建子類,則該方法是Boss子類的一部分。或....

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

這不是直觀的,我知道,你不能只是做一個可變的副本,你必須從mutableOrderedSetValueForKey得到一個特殊的代理對象。


[原創普遍的答案] ...

核心數據目前擁有使用「有序關係」,你可以在你的模型中指定的能力。如果這樣做,對象模型中的關係將由NSOrderedSet這一新類別表示,它是NSArrayNSSet的混合。通過對這個關係對象中的對象進行重新排序並保存上下文,您將重新排序數據庫中的對象,並且它們將保持其新的順序。當對象沒有自然排序屬性時,就會使用這種有序關係。例如,訂單僅表示用戶在UI中對訂購列表的偏好。

另一方面,如果您的某個對象上有一個屬性描述集合的順序,那麼您可以通過指定Sort Descriptors來使用該屬性來排序NSFetchRequest的結果。該屬性的值將指定對象在NSFetchRequest的結果中的位置。

如果您使用的是Ordered Relationships,則需要保持該關係的NSOrderedSetUITableView的同步順序。如果更改是從UI驅動的,那麼您響應UITableViewDataSource委託方法(如- (void)moveRowAtIndex:(NSUInteger)sourceIndex toIndex:(NSUInteger)destinationIndex),並使用提供的信息將相應對象移動到其在覈心 - 數據關係中的新位置,方法是使用代理對象mutableOrderedSetValueForKey:或Core -data生成了生成的子類的訪問器。

如果以順序的變化是從數據面驅動的,你會使用上UITableViewinsertRowsAtIndexPaths:withRowAnimation:moveRowAtIndexPath:toIndexPath:方法在UITableView行與您的數據進行更改同步。

如果您使用的是NSFetchRequest,您也有類似的任務。在這種情況下,您可以通過更新對象的排序屬性來響應訂單中用戶驅動的更改,以匹配UITableViewUITableViewDataSource代表所描述的新訂單。或者如果訂單更改從數據端開始,則通過它的方法更新UITableView以匹配正在對數據進行的排序屬性所做的更改。在這種情況下,您將使用NSFetchResults的結果作爲NSArray,您還必須保持該對象同步,直到下次運行NSFetchRequest。您可以使用相同的排序描述符對數組進行排序,或創建一個NSMutableArray並使用它的方法移動數據以匹配表。

最後,如果你正在使用NSFetchRequest你可能想看看NSFetchedResultsController它的工作是簡化同步排序的NSFetchRequestUITableView的任務。文檔中有很好的示例代碼。在這種情況下,您可能會發現數據的排序會自行處理。例如,假設您的表格是按「分配日期」(即員工被分配給老闆的日期)排序的,那麼只需使用正確的信息創建對象就會在表格中觸發正確的結果。

請注意訂購的關係不適用於iCloud。然而,在我看來,iCloud無法正常工作,所以這不是問題。

+0

嘿謝謝你的回覆,實際上我有一個添加老闆和分配給他的員工使用添加按鈕。我希望新的老闆和員工應該永遠處於第一位。我知道我必須使用insertObject:atIndex函數,但是使用哪種方法。請回復 – Ranjit

+0

編輯答案以描述更多關於在覈心數據中訂購數據和同步表中訂單的信息。請注意,表格及其數據源必須匹配,所以表示它必須在表格中首先與數據源中的第一個表示相同(即,當表格請求單元格爲第一行)保持數據源同步的方式取決於數據源(上述兩個常用選項),使用編輯答案中提及的方法使表保持同步。記住儘管表格和數據源必須匹配,否則將會出現錯誤。 –

+0

請檢查我已經添加了上面創建僱員對象的代碼,所以如果我必須對NSOrderedSet進行更改,是否應該在這裏完成,請檢查上面的代碼 – Ranjit