2009-10-15 33 views
0

我不明白爲什麼賦值給數組對象的值在執行executeFetchRequest後變得「無序」。那麼,我不確定提取是否是這裏的問題。這是代碼。無序/有序的上下文獲取

objects=[NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",nil]; 

NSManagedObject *DB = nil; 

for (int i=0;i<[objects count];i++){ 

DB = [NSEntityDescription     
       insertNewObjectForEntityForName:@"dbTable" 
       inManagedObjectContext:context]; 

[DB setValue:[objects objectAtIndex:i] forKey:@"item"]; 
[DB setValue:[NSString stringWithFormat:@"%3.2f", 0] forKey:@"value"];  
} 

objects = [context executeFetchRequest:request error:&error]; 

裴安平

新錯誤排序後取入執行對象數組
索引0 ::檔案:d
索引1 ::項目:C
索引2 ::物品:電子
index 3 ::商品:b
index 4 ::商品:a

謝謝。

回答

2

由於基礎數據庫架構,Core Data以無序方式存儲所有對象和多對多引用。正如Alex所描述的那樣,除非您應用NSSortDescriptor,否則無法保證您從獲取請求中獲得的順序。 Cocoa郵件列表中的This thread詳細介紹了涉及的問題以及一些潛在的解決方案。

這些解決方案包括具有您在執行提取請求時排序的索引屬性,或實現託管對象的鏈接列表並按順序遍歷它們。 Brian Webster創建了NSManagedObject的子類,它允許您在覈心數據對象中維護有序的一對多關係,可以找到源代碼here

+0

有趣的答案。謝謝。 –

+0

嗨布拉德,你和亞歷克斯的評論非常有啓發性。布賴恩韋伯斯特的子類是爲了多對多的關係,而不是我的情況。我認爲對我來說這個想法是記錄用戶輸入順序的另一個屬性。是的,不是一個複雜的,但證明工作。謝謝。 – BigJoke

0

當您執行提取請求時未指定您希望按特定鍵排序項目時,您會得到未排序的結果數組。您可以使用類似下面的代碼片段來擴展您的獲取請求。

// Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 
+0

嗨, 我想我誤導你們把字母排序的值,這只是在取得結果後進行演示。我的問題真的是,我想保持用戶輸入順序,沒有額外的數據庫屬性。謝謝你不可饒恕。 – BigJoke

1

應用的NSSortDescriptor您的讀取請求,例如:

NSSortDescriptor *itemDescriptor = [[NSSortDescriptor alloc] initWithKey:@"item" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:itemDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[itemDescriptor release]; 

將排序的item名。相反,您可以使用value

+0

嗨亞歷克斯, 我也遇到過這個想法(雖然不知道如何在obj-c中做到這一點)。現在我知道如何。但是,我所要做的就是將項目按照用戶輸入的順序排列,並且不要在我的數據庫中使用更多屬性來接收輸入順序。那可能嗎?感謝您的幫助。 – BigJoke

+0

除非用戶以可以用作自然排序的順序輸入項目(即,所輸入的值可以按原樣排序),我相當確定您需要使用另一個存儲輸入順序的鍵,然後根據提取進行排序。 –

+1

我明白了,在幕後,託管對象的子類被扔進'NSSet'類型的包中。成員集合沒有特定的順序,因爲構建集合的唯一要求是成員是唯一的。假設一個排序描述符被添加到提取中,提取是對從該集合中讀出的內容應用排序。 –