从核心数据库中检索数据的替代方法 - ios

时间:2011-10-02 19:34:06

标签: ios core-data nsfetchrequest

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

现在,我就是这样做的。

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

}

还有其他方法可以以更快的方式执行相同的操作吗?

如果是这样的话,如果有人可以帮我解决这个问题会很棒。

2 个答案:

答案 0 :(得分:1)

问自己几个关于数据要求的问题。

您是否需要立即访问所有结果?如果您一次只需要一个小数字,则只能检索NSManagedObjectID

[request setResultType:NSManagedObjectIDResultType];

这将非常快,并为您提供排序列表,但您必须根据需要检索实际数据。

如果您需要更快的数据,则可以检索出现故障NSManagedObject

[request setIncludesPropertyValues:NO];

这将提前分配对象,但在您请求之前不会获取实际数据。

或者,您是否需要在提取过程中执行排序,或者如果对象在内存中,您是否可以更快地进行排序?

值得为自己创建一个测试工具并尝试各种选项,以查看哪种选项最适合您的应用。

答案 1 :(得分:1)

有一些问题:

  1. 你没有谓词。因此,您正在检索整个表。这可能是你最大的问题。
  2. 您正在加载检索中的所有完整对象。这将大大减缓事情的发展。如果您不需要实现整个对象,那么我建议重新开启-setReturnsObjectsAsFaults:
  3. -setFetchBatchSize:的设置可能没有您期望的效果。如果要限制返回的结果数,请使用-setFetchLimit:
  4. 制作-mutableCopyNSArray结果没有任何价值。我怀疑你是从书上得到的,并建议你不要这样做。