我有3種實體類型,單元/部門/文件..我的多對多關係的核心數據抓取非常緩慢?
單位/處有一對許多上部側,即,一個單元可以具有多個部門,但每一個核心數據數據庫部門只能有一個單位。
每個文檔可以是一個或多個單位和部門的一部分,我需要能夠找到與所選單位或部門匹配的文檔。單位ID可以是「1234」,該單位的部門ID可以是「123499」。請注意,部門編號始終是該單位的4位數字,然後是2位更多的部門描述。
這麼多的數據模型,問題是,當我選擇一個單位(和沒有部門),並需要列出該單位下的所有文件,搜索應返回屬於該單位的所有文件和所有屬於該單位下的所有部門的文件,並且該文件在5000個文件中佔用4秒以上,我必須做錯事。
我正在使用NSFetchedResultsController,這裏是我的謂詞。
NSPredicate *predicate;
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Document"];
[req setPropertiesToFetch:[NSArray arrayWithObjects:@"name",@"publisher",@"isFavourite", nil]];
req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
[req setFetchBatchSize:15];
predicate = [NSPredicate predicateWithFormat:@"ANY units.id == %@ || ANY departments.id BEGINSWITH[cd] %@",self.selectedUnit.id,self.selectedUnit.id];
我可以用另一種方式做到這一點嗎?我想知道是否可以選擇單元,然後通過Unit.documents代替,但是我認爲我的FetchController不是必需的,我需要將結果放入一個數組中,並將它們排序(首先將所有Entitites ,並且需要更長的時間)..
更糟糕的是,我還需要能夠在稍後的文檔的名稱屬性中進行搜索,並且CONTAINS [cd]使搜索更慢,不幸的是我無法分割把單詞放到一個單獨的表中,因爲我需要能夠在單詞中拼寫單詞,也就是說,用戶可以鍵入「結果」,並且搜索應該返回標題中某處的「結果」的所有文檔,例如可以被「NSFetchedResultControllers很酷」
我怎樣才能讓CONTAINS海rch執行得更好,現在我只有5000個文檔,但它也可能是20000或更多。
任何好主意,想法?我觀看了很多WWDC核心數據視頻,閱讀了Apple開發者網站上的核心數據性能,我真的認爲我已經做到了正確的方式,但也許我的模型都是錯誤的,我可以在SQL調試中看到,那裏有在連接表中使用了很多時間,並且我試圖弄清楚如何使SQL更清晰。
非常感謝您 /雅各布
我已經使用索引對我的「name」屬性,所以我不能沒有獲得更多的表現很遺憾。而且由於我需要在文字中進行搜索,所以我不知道如何讓搜索更好。它會幫助維護一個搜索詞表,然後在該表中進行CONTAINS搜索?每個實體只有一個單詞,因此CONTAINS只會搜索有限數量的字符,而不是文檔的全部「名稱」,「名稱」最多可以包含15-20個字符。感謝您的示例代碼,但「99」只是一個例子,它也可能是「1234HG」,對不起 –