3

これはiOS上にあります。

約350000個のオブジェクトを持つコアデータベースがあります。オブジェクト(製品)には、「バーコード」と「指定」の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つだけフェッチしたいのですが、それを高速化する方法はありますか?

起動時にすべてのオブジェクトを配列にロードすると、アプリの起動が非常に遅くなり、大量のRAMが使用されます。

前もって感謝します!

編集:[fetch setFetchLimit:1]を追加しました; 少しスピードアップします。ただし、オブジェクトがデータベース内で下がるほど、速度は遅くなります。

4

3 に答える 3

7

属性はBarcodeインデックス付けされていますか?

于 2010-12-13T14:29:26.890 に答える
4

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

ただし、その数のエントリがあり、エントリに2つのプロパティ(バーコードと指定)しかない場合、およびバーコード側からクエリを実行して指定側を返すだけの場合、CoreDataを使用するのはやり過ぎかもしれません。

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

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

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

于 2010-12-13T14:35:55.953 に答える
1

オブジェクトがデータベースのさらに下に行くほど時間がかかる理由は、Core Dataが、最初のオブジェクトへのポインターを配置し、検索項目への値を理解し、次のオブジェクトへのポインターを配置するという、かなり鈍い検索アルゴリズムを使用するためです。したがって、比較が一致するまで1つです。

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

代わりに、インテリジェントな検索アルゴリズムを備えたいくつかの優れたフレームワークを備えたSQliteデータベースをセットアップすることを検討することもできます。

于 2010-12-13T14:39:48.360 に答える