从核心数据数据库检索数据的替代方法-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条记录与核心数据无关,应该几乎是即时的。这些记录中有二进制数据吗?它们有多大?