1

我有一个包含相对较大的SQLite数据库的应用程序,其中包含大约15,000行。在应用程序开始时,我运行一个SELECT * FROM TABLE查询并填充一个NSMutableArray *data包含类的元素ProverbRow。每个ProverbRow对象对应数据库中的一行数据,包含NSStrings和NSIntegers对应数据库的每个单元格。因此,该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 次。在我的 iPhone 5 上重复这个过程 100 次需要 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 回答