2011-04-28 73 views
0

我在我的iPhone應用程序上使用核心數據來存儲大約1000個對象。每個對象都被分配了5個不同的組中的一個。隨着時間的推移,對象會更改組,並且在每個組內,這些組中對象的順序會發生更改並存儲在數組中。快速核心數據導入問題

然後,我拿這個數組,並使用'name'屬性將它存儲到plist。當我重新啓動應用程序時,我的AppDelegate會掃描數據庫中的每個對象,然後將其與我的plist中的'name'屬性進行比較。完成後,我有5個核心數據對象數組,按組排序,每個數據對象都以原始保存的順序排列。最終的結果是好的。完成此任務所需的時間不是。

我想讓這個更快。如果我可以將實際的核心數據對象數組保存到我的plist,我會這樣做。但我只能保存屬性。

蘋果對實施documentation查找或 - 創建高效,具體而言,此代碼:

// get the names to parse in sorted order 
NSArray *employeeIDs = [[listOfIDsAsString componentsSeparatedByString:@"\n"] 
     sortedArrayUsingSelector: @selector(compare:)]; 

// create the fetch request to get all Employees matching the IDs 
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity: 
     [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:aMOC]]; 
[fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"(employeeID IN %@)", employeeIDs]]; 

// make sure the results are sorted as well 
[fetchRequest setSortDescriptors: [NSArray arrayWithObject: 
     [[[NSSortDescriptor alloc] initWithKey: @"employeeID" 
       ascending:YES] autorelease]]];NSError *error = nil; 

NSArray *employeesMatchingNames = [aMOC 
     executeFetchRequest:fetchRequest error:&error]; 

然而,fetchRequest設置一個SortDescriptor和排序使用「僱員」的關鍵。我試過這個。我有一個ID鍵屬性,可以在將對象添加到組中時保存數組索引位置。但是,由於正在從每個組添加和刪除對象,對象的索引不斷變化。所以每次更改後,我都必須重新掃描每個組並重置索引。對我而言,這隻會將我的速度問題轉移到我的程序的另一部分。

我的問題是:有沒有更好的方法來保存對象在數組中的索引位置?還是有一個不同的地方,我可以存儲一個核心數據對象的數組?但是,如果我做了後者,因爲我的應用程序已經在appStore中,我的理解是如果我將屬性或表添加到數據庫中,這會在用戶升級時導致問題。

我希望我解釋得很好。任何幫助將不勝感激,謝謝。

回答

0

您正在使這種方式變得複雜。你想解決的問題,即基於屬性值排序對象,是一個非常普遍的需要,例如,每個tableview都需要這種類型的排序。

排序是爲什麼您可以提供一個或多個排序描述符到提取。在這種情況下,您想要訂購employeeID屬性,因此您只需提供該密鑰的排序。由fetch返回的數組將按該屬性排序。

當您添加或刪除對象時,您只需再次直接或使用通知重新運行提取。如果你使用NSFetchedResultsController,這一切都會自動處理。

如果您需要某種任意排序,請說出用戶的收藏夾列表,那麼您需要直接在數據模型中對該任意排序建模。根據需要的特定類型,有多種方式可以這樣做。

這是核心數據進行設計時,一個很好的經驗法則:如果您有任何其他的數據結構來保持或超越秩序的陣列管理對象由取回來了,你做錯了什麼。

正確使用,核心數據可以管理整個數據模型,無需任何外部結構。如果您發現自己將額外的數據結構焊接到核心數據上,那麼您在數據模型設計中漏掉了一些東西。

0

在iPhone上,除了存儲索引之外,沒有辦法維護有序集合。該屬性是一個整數,是否正確?

如果添加屬性,會發生什麼情況需要以試圖自動遷移的方式設置persistantStoreCoordinator。如果你以前從未創建過另一個模型版本,這將是棘手的。你應該嘗試一下,看看你是否可以得到它的工作,因爲你有可能會有一天這樣做...

我對CoreData的感覺是,遷移是非常棘手,你應該始終保持任何用戶生成的數據也可以像一個plist那樣在一邊,你可以重新建立一個數據庫。聽起來你可能已經在這麼做了?如果是這樣,您可以在創建persistantStoreCoordinator時檢查它是否失敗,如果是,則擦除存在的數據庫,再次創建persistantStoreCoordinator並從plists填充該數據庫。