2010-12-13 27 views
3

これはiOS上です。コアデータフェッチを高速化する

私は約350,000のオブジェクトを持つコアデータベースを持っています。オブジェクト(製品)には、「バーコード」と「指定」という2つのプロパティがあります。ユーザは、「バーコード」を検索することによってオブジェクトを検索することができ、「指定」が返されるべきである。遅い以外はすべてうまくいっています。私が使用するコードは次のとおりです。

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]; 

私は1つのオブジェクトのみを取得したいので、それをスピードアップする方法はありますか?

起動時にすべてのオブジェクトをArrayに読み込むと、アプリケーションの起動が非常に遅くなり、大量のRAMが必要になります。

ありがとうございます!

編集:[fetch setFetchLimit:1]を追加しました。それは少しスピードアップします。しかし、オブジェクトが存在するデータベースの速度が遅くなってきています。

+0

ちょうど質問したい(たぶん役立つかもしれない)なぜすべてのデータをすべての起動時に配列にロードするのですか? – shannoga

+0

私はそれをしません。しかし、私はそれをすると、私は遅いスタートアップを持つだろうと言った:) – Mikael

答えて

7

Barcode属性はインデックスに登録されていますか?

+0

ありがとう!それは本当に素晴らしい私の問題を解決!私は実際に金曜日の仕事から家に帰る途中でインデックスを作成することを考えていましたが、それから週末だったので、私はそれについて完全に忘れました:)もう一度ありがとう! – Mikael

4

まず、@パールベイが書いたように、Barcodeがインデックスされているかどうかを確認します。

しかし、多くのエントリがあり、エントリが2つのプロパティ(バーコードと指定)しか持っていない場合や、バーコード側からクエリ側に戻って指定側に戻った場合、CoreDataを使用するのは残酷かもしれません。

CoreDataは、ディスクに永続性を持たせたオブジェクト指向の多くの機能を提供しますが、もちろんペナルティが付いています。

CoreDataを完全に削除し、sqLiteを直接使用する方がよい場合があります。そのためにFMDBと呼ばれる素晴らしい軽量Objective-Cラッパーがあります。hereを参照してください。

CoreDataに固執する場合は、this Apple documentで説明されているように、バックグラウンドスレッドでフェッチしてメインスレッドに結果を表示する方法があります。この方法では、データベースの検索中にUIがフリーズしません。

+0

はい、私は実際にFMDBを使ってプロジェクトを開始しましたが、代わりにコアデータを使用しました。私はこれをしました。なぜなら、将来、アプリにいくつかの追加情報があるかもしれないからです。 – Mikael

+0

と@paulbaileyとして索引付けが行われました。それは良い! CoreDataプロパティのインデックスを自分自身で忘れることがよくあります:p – Yuji

0

オブジェクトがデータベースをさらに長くするのに時間がかかる理由は、コアデータが最初のオブジェクトへのポインタを配置し、その値を検索項目に格納し、ポインタを次のものと比較されます。

データベース(ソート済み/ソートされていないリスト、ツリー構造など)によって、Quicksearch、Hashsearches、treesearchなどを使用できる検索アルゴリズムがたくさんあります。

代わりにインテリジェントな検索アルゴリズムを備えた素晴らしいフレームワークを持っているSQliteデータベースを設定することも考えられます。