从核心数据库检索数据的备用方法 – ios

我从数据库中检索数据时遇到性能问题。

现在,这是我怎么做的。

+(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]; } 

有没有其他的方式来执行相同的操作,但以更快的方式?

如果是这样的话,如果有人能帮我解决这个问题,那就太好了。

有几个问题:

  1. 你没有谓词。 因此您正在检索整个表格。 这可能是你最大的问题。
  2. 您正在加载检索的所有完整对象。 这将大大减缓事态。 如果你不需要实现的全部对象,那么我build议转动-setReturnsObjectsAsFaults:回来。
  3. -setFetchBatchSize:的设置可能没有你所期望的效果。 如果要限制返回结果的数量,请使用-setFetchLimit:
  4. 制作NSArray结果的-mutableCopy没有任何价值。 我怀疑你是从书中得到的,build议你不要这样做。

问你自己一些关于你的数据需求的问题。

你需要一次访问所有的结果吗? 如果你一次只需要一个小号码,你只能检索到NSManagedObjectID

 [request setResultType:NSManagedObjectIDResultType]; 

这将是非常快速的,并给你一个sorting列表,但你将不得不检索实际的数据根据​​需要。

如果你需要更快的数据,你可以检索错误的NSManagedObject

 [request setIncludesPropertyValues:NO]; 

这将提前分配对象,但不会获取实际的数据,直到您请求它。

或者,你需要执行sorting作为获取的一部分,或者如果你能以某种方式更快地做到这一点,一旦对象在内存中?

值得创build一个testing工具,并尝试各种选项,以查看哪些最适合您的应用程序。