Ios 搜索NSMutableArray v.s.Sqlite搜索查询

Ios 搜索NSMutableArray v.s.Sqlite搜索查询,ios,sqlite,search,Ios,Sqlite,Search,我有一个应用程序,它有一个相对较大的SQLite数据库,包含大约15000行。在应用程序开始时,我运行一个SELECT*fromtable查询,并填充一个NSMutableArray*数据,其中包含一个类行的元素。每个行对象对应于数据库中的一行数据,并包含与数据库的每个单元格对应的NSStrings和NSIntegers。因此,NSMutableArray*data对象实际上是SQLite数据库的副本 现在,关于这个问题 我想在应用程序中添加一个搜索功能,如以下示例: 当用户键入“abc”并点击

我有一个应用程序,它有一个相对较大的SQLite数据库,包含大约15000行。在应用程序开始时,我运行一个
SELECT*fromtable
查询,并填充一个
NSMutableArray*数据
,其中包含一个类
行的元素。每个
对象对应于数据库中的一行数据,并包含与数据库的每个单元格对应的
NSString
s和
NSInteger
s。因此,
NSMutableArray*data
对象实际上是SQLite数据库的副本

现在,关于这个问题

我想在应用程序中添加一个搜索功能,如以下示例:

当用户键入“abc”并点击搜索时,我想获取
数据的所有元素,其中
NSString*谚语
对象中
谚语行
包含字符串“abc”作为子字符串。因此,应该获得“abcde”、“qqqabcqq”等字符串

目前,为了实现这一点,我启动了一个类似这样的查询:
SELECT*FROM saddle WHERE发音像abc
。我从查询中得到的对象存储在另一个
NSArray
中以供进一步使用

现在,如果只返回少量的对象,那么这个查询完成的速度足够快,但是如果行数较多,则需要花费大量时间

我想知道除了启动查询之外,是否还有更快的方法来完成这项任务。是否可以使用已经填充的
数据
对象,并通过循环运行它,并使子字符串相等或类似的东西我主要关心的是减少搜索所需的时间。


谢谢

15k很小。只需对内存中的对象进行线性扫描

以下测试在字母表末尾找到
xyz
。在我的iPhone5上重复这个过程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
NSMutableArray*data=[[NSMutableArray alloc]initWithCapacity:15000];
对于(int i=0;i<15000;++i)
[数据添加对象:@[@“abcdefghijklmnopqrstuvwxyz”,@123];
NSLog(“启动测试”);
整数计数=0;
对于(int i=0;i<100;++i){
NSIndexSet*s=[ObjectsPassingTest的数据索引:^BOOL(id obj,NSUInteger idx,BOOL*stop){
NSString*s=obj[0];
返回[s rangeOfString:@“xyz”]。位置!=NSNotFound;
}];
计数+=s.count;
}
NSLog(@“已完成测试:%d”,计数);//产出150万

让我重申一下:15K很小。

15K很小。只需对内存中的对象进行线性扫描

以下测试在字母表末尾找到
xyz
。在我的iPhone5上重复这个过程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
NSMutableArray*data=[[NSMutableArray alloc]initWithCapacity:15000];
对于(int i=0;i<15000;++i)
[数据添加对象:@[@“abcdefghijklmnopqrstuvwxyz”,@123];
NSLog(“启动测试”);
整数计数=0;
对于(int i=0;i<100;++i){
NSIndexSet*s=[ObjectsPassingTest的数据索引:^BOOL(id obj,NSUInteger idx,BOOL*stop){
NSString*s=obj[0];
返回[s rangeOfString:@“xyz”]。位置!=NSNotFound;
}];
计数+=s.count;
}
NSLog(@“已完成测试:%d”,计数);//产出150万

让我重申一下:15K很小。

对填充的NSMutableArray进行线性扫描会比搜索查询更快吗?我已经通过快速分析修改了我的答案。直接回答您的问题:是的,它会更快,因为您避免了从动态类型的磁盘存储格式到SQLite的VM,最后通过其API所产生的巨大开销。如果SQLite可以使用索引,那么它将具有显著的优势,但是它不能使用像“%abc%”这样的
。因此,它没有优势,也没有机会对抗原始的本机代码!谢谢对填充的NSMutableArray进行线性扫描能比搜索查询更快吗?我已经通过快速分析修改了我的答案。直接回答您的问题:是的,它会更快,因为您避免了从动态类型的磁盘存储格式到SQLite的VM,最后通过其API所产生的巨大开销。如果SQLite可以使用索引,那么它将具有显著的优势,但是它不能使用像“%abc%”这样的
。因此,它没有优势,也没有机会对抗原始的本机代码!谢谢