2010-12-13 59 views
3

這是iOS版本。加速核心數據提取

我有一個大約有350 000個對象的核心數據庫。對象(產品)具有兩個屬性:「條形碼」和「名稱」。用戶可以通過搜索「條形碼」搜索對象,並返回「指定」。一切工作正常,除非它很慢。我使用的代碼是:

NSEntityDescription *_product = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:importContext]; 
NSFetchRequest *fetch = [[NSFetchRequest alloc]init]; 

[fetch setEntity:_product]; 
[fetch setPredicate:[NSPredicate predicateWithFormat:@"Barcode == %@",theBarcode]]; 

NSError *error = nil; 
NSArray *results = [importContext executeFetchRequest:fetch error:&error]; 

NSManagedObject *object = [results objectAtIndex:0]; 

因爲我只希望獲取一個對象,是有辦法加快步伐?

如果我在啓動時將每個對象加載到一個Array中,我會得到一個非常緩慢的應用程序啓動並佔用大量內存。

在此先感謝!編輯:我添加了[fetch setFetchLimit:1];這加快了一點點。但是,數據庫中的對象所處的速度越來越慢。

+0

只想問一下(可能會有幫助)爲什麼在每次啓動時將所有數據加載到數組? – shannoga 2010-12-13 15:54:02

+0

我不這樣做。但我說,如果我這樣做,那麼我會有一個緩慢的啓動:) – Mikael 2010-12-13 16:22:17

回答

7

索引Barcode屬性?

+0

謝謝!這解決了我的問題真的很好!我實際上正考慮在星期五下班回家的路上索引,但那是週末,我完全忘了它:)再次感謝! – Mikael 2010-12-13 14:42:32

4

首先,@paulbailey寫道,檢查是否索引Barcode。但是,如果你有很多條目,並且如果你的條目只有兩個屬性(條形碼和名稱),並且只從條形碼側進行查詢並返回指定端,那麼使用CoreData可能是一種矯枉過正。

CoreData爲您提供了很多面向對象的持久化磁盤設備,但它當然會帶來懲罰。

您可能會更好地放棄CoreData,並直接使用sqLite。有一個很好的稱爲FMDB的輕量級Objective-C包裝器,請參閱here

如果你想堅持CoreData,讓事情變得更好的一種方法是獲取後臺線程並在主線程中顯示結果,如this Apple document中所述。這樣,在搜索數據庫時UI不會凍結。

+0

是的,實際上我是通過使用FMDB開始項目的,但最終使用了Core Data。我這樣做是因爲將來可能會有一些額外的信息給應用程序。 – Mikael 2010-12-13 14:43:44

+0

和索引作爲@paulbailey說。那很好!我經常忘記自己編寫CoreData屬性:p – Yuji 2010-12-13 14:46:55

0

Core Data使用一種非常枯燥的搜索算法,它只需將指針指向第一個對象,將其值指向searchitem,將指針指向下一個等等,直到比較匹配。

有很多搜索算法可以使用,取決於你的數據庫(排序/不排序列表,樹結構等),你可以使用Quicksearch,Hashsearches,treesearch等。

你也可以考慮設置一個SQlite數據庫,它有一些很好的智能搜索算法框架。