我正在使用coredata作爲其持久性存儲的iphone的企業ios應用程序。我們有幾個核心數據實體,其中一個有30個字段。我的數據集超過了這些30個實體的45,000個。ios coredata搜索大型數據集
我需要構建一個查詢,其中我的搜索字符串可以匹配對象上12個不同字段之一。我的NSPredicate基本上是一個大鼠窩(屬性== $ A)|| (otherproperty == $ A)...等$ A是我的搜索字符串。
我們剛剛開始調整它的性能,因爲它很糟糕。我們應該做什麼明顯的事情?使用複合謂詞並且每個子謂詞都是(property == $ A)會更好嗎?
想法?提前致謝。
我的(部分)解決方案 - 我觀看了關於核心數據的一些wwdc視頻,基本上做了Apple所說的。從我的真實對象到另一個對象來創建一個關係來表示一個搜索令牌。這個新的搜索令牌實體有兩個字段 - 令牌和權重。當我將主要對象插入coredata時,我給他一組這些搜索令牌。我想查詢的每個字段的一個搜索標記以及標記屬性的內容是某種標準化(全部小寫)的數據。然後我的謂詞就是「任何searchTokens.token以%@開頭」。因此,現在我們只是在其索引字段上搜索一個表,並且我們不必在where子句的右側進行任何擴展。 Coredata的搜索速度非常快。我唯一做的另一件事是將NSTimer放在shouldReloadTableForSearchString中,以便在1秒鐘不活動後觸發搜索。
這只是我的看法,不知道你是否可以做到,但是因爲我在做iOS開發,所以我擺脫了我所有的Web應用+關係數據庫背景,有時候我發現真的很有幫助計算多字段值然後將其存儲在非持久性或持久性屬性中,僅用於特定的提取請求。只需記住在NSManagedObject的保存和更新期間刷新數據。 – Leonardo
你看過哪個視頻,你能分享一下嗎?另外,既然你有多個實體你使用了一個單一的searchToken對象還是不止一個?將單個搜索標記對象連接到多個實體的任何問題?感謝您使這個答案如此有用。 –