1

周りの行を含む、比較的大きなSQLiteデータベースを持つアプリがあります。15,000アプリの開始時に、SELECT * FROM TABLEクエリを実行しNSMutableArray *data、クラスの含まれる要素を設定しProverbRowます。各ProverbRowオブジェクトは、データベースの 1 行のデータに対応し、データベースの各セルに対応するNSStringおよびを含みます。NSIntegerしたがって、事実上、NSMutableArray *dataオブジェクトはSQLiteデータベースのコピーです。

さて、質問に...

この例のように、アプリに検索機能を追加したい:

ユーザーが「abc」と入力して検索をタップすると、オブジェクト内の文字列「abc」が部分文字列として含まれるdataすべての要素を取得したいと考えています。したがって、「abcde」、「qqqabcqqq」などの文字列を取得する必要があります。NSString *proverbProverbRow

現在、これを達成するために、次のようなクエリを発行していますSELECT * FROM PROVERB WHERE PRONUNCIATION LIKE abc。クエリから返されたオブジェクトはNSArray、さらに使用するために別のオブジェクトに保存されます。

ここで、返されるオブジェクトの数が少ない場合、このクエリは十分に速く完了しますが、行数が多いと時間がかかります。

クエリを起動する以外に、これを達成するためのより迅速な方法があるかどうか疑問に思っていました。すでに入力されているdataオブジェクトを使用してループを実行し、部分文字列などを同等にすることは可能ですか? 私の主な関心事は、検索にかかる時間を短縮することです。

ありがとう!

4

1 に答える 1

1

15kは小さいです。メモリ内オブジェクトの線形スキャンを実行するだけです。

次のテストxyzでは、アルファベットの末尾にある を 15000 回検出します。このプロセスを 100 回繰り返すと、私の iPhone 5 では 4.7 秒かかりました。すべての要素を返すフル スキャンの場合は 47 ミリ秒です。

NSMutableArray * data = [[NSMutableArray alloc] initWithCapacity:15000];
for (int i = 0; i < 15000; ++i)
    [data addObject:@[@"abcdefghijklmnopqrstuvwxyz", @123]];

NSLog(@"Starting test");
int count = 0;
for (int i = 0; i < 100; ++i) {
    NSIndexSet * s = [data indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        NSString * s = obj[0];
        return [s rangeOfString:@"xyz"].location != NSNotFound;
    }];
    count += s.count;
}
NSLog(@"Finished test: %d", count); // Outputs 1500000

繰り返しますが、15 k は小さいです。

于 2013-07-01T08:53:26.650 に答える