从核心数据数据库检索数据的替代方法-ios
从数据库检索数据时出现性能问题 现在,我就是这样做的从核心数据数据库检索数据的替代方法-ios,ios,core-data,nsfetchrequest,Ios,Core Data,Nsfetchrequest,从数据库检索数据时出现性能问题 现在,我就是这样做的 +(NSMutableArray *) searchObjectsInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending { i3EAppDelegate *appDelegate = (i3EAppDelegate *)[[UIApplication sharedAppl
+(NSMutableArray *) searchObjectsInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending
{
i3EAppDelegate *appDelegate = (i3EAppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[request setEntity:entity];
[request setFetchBatchSize:5];
//[request setFetchLimit:10];
[request setReturnsObjectsAsFaults:NO];
// If a predicate was passed, pass it to the query
if(predicate != nil)
{
[request setPredicate:predicate];
}
// If a sort key was passed, use it for sorting.
if(sortKey != nil)
{
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:sortAscending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
}
NSError *error;
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[request release];
//[context release];
appDelegate = nil;
return [mutableFetchResults autorelease];
}
是否有其他方法可以更快地执行相同的操作
如果是这样,如果有人能在这方面帮助我,那就太好了。问自己几个关于数据要求的问题 您需要一次访问所有结果吗?如果一次只需要一个小数字,则只能检索
NSManagedObjectID
:
[request setResultType:NSManagedObjectIDResultType];
这将非常快,并为您提供一个排序列表,但您必须根据需要检索实际数据
如果您需要更快一点的数据,您可以检索出现故障的NSManagedObject
[request setIncludesPropertyValues:NO];
这将提前分配对象,但在您请求之前不会获取实际数据
或者,您是否需要将排序作为获取的一部分来执行,或者是否可以在对象进入内存后以某种方式更快地执行排序
值得自己创建一个测试工具,并尝试各种选项,看看哪些最适合您的应用程序。有几个问题:
-setReturnsObjectsAsFaults:
-setFetchBatchSize:
的设置可能没有预期的效果。如果要限制返回的结果数,请使用-setFetchLimit:
NSArray
结果进行-mutableCopy
没有任何价值。我怀疑你是从一本书中得到的,建议你停止这样做谢谢马库斯的回复。我正在设置一个谓词。。我在调用函数时发送谓词。我将研究“setReturnsObjectAsFaults”,看看如何使用它。另外,感谢您指出-mutableCopy。。我想知道它是如何影响我的性能的。@learner2010,-mutableCopy不会对性能产生太大影响,但它是错误的,因为它没有任何用处。不幸的是,有一个写得不好的例子流传开来,我怀疑这就是你得到它的原因(我经常看到)。除了格式正确的
NSPredicate
之外,设置提取限制并作为错误(空对象)返回将是最大的性能提升。你的NSPredicate
是什么样子的?下面是我的谓词的样子<代码>NSPredicate*谓词=[NSPredicate谓词格式:@“用户==%@&(起始日期=%@)”,对象,今天日期,过去日期]代码>谓词看起来不错,不过我会将用户
比较切换到末尾,以便它首先进行数值比较。您在这里处理多少数据?核心数据中有多少记录?500-600条记录与核心数据无关,应该几乎是即时的。这些记录中有二进制数据吗?它们有多大?