0

对不起我的英语不好,我是使用 CoreData 的初学者。

现在我正在尝试查找数据库中是否存在 NSString,

有两种方法可以做到这一点,一种是使用 NSPredicate 来做请求,

如果results数组计数 >= 1,表示确实在数据库中找到了一些东西

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"itemid == %@", self.item.itemid]];
 NSError *error = nil;
 NSArray *results = [context executeFetchRequest:fetchRequest error:&error];

另一个是在数组中循环

 for (int i=0; i<=[keyArray count]-1 ; i++) {
            NSString *keyID = [keyArray objectAtIndex:i];
            if ([keyID isEqual:stringToCompare])
                return YES;
                break;
    return NO;
 }

我现在正在使用第一种方法,但是有人可以给我一些建议吗?

哪一个最适合性能?谢谢!

4

2 回答 2

2

您的第二种方法(数组循环)要求从数据库中获取所有对象,因此这应该比第一种方法慢,第一种方法只获取匹配的对象。

如果您只对具有给定键的对象的存在感兴趣,您甚至可以改进第一种方法,方法是 将结果集限制为一个对象,并使用 countForFetchRequest而不是实际获取对象:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"itemid == %@", self.item.itemid]];
[fetchRequest setFetchLimit:1];
NSUInteger count = [context countForFetchRequest:fetchRequest error:&error];
if (count == NSNotFound)
    // some error occurred
else if (count == 0)
    // no matching object
else
    // at least one matching object exists
于 2013-09-10T05:29:50.890 回答
1

实际上,您不能说哪种方法最好,因为它取决于许多因素。比如sqlite数据库有多少数据?如果您能够确认数据大小,则可以执行简单的负载测试。在 sqlite 和数组中创建虚拟数据,然后使用这两种方法找出它们需要多长时间。如果数据量太大,我建议你使用 sqlite 而不是数组循环。

于 2013-09-10T03:51:57.507 回答