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

Posted

技术标签:

【中文标题】从核心数据数据库中检索数据的替代方法 - ios【英文标题】:Alternate way to retrieve data from core data database - ios 【发布时间】:2011-10-02 19:34:06 【问题描述】:

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

现在,我就是这样做的。

+(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】:

有几个问题:

    您没有谓词。因此,您正在检索整个表。这可能是您最大的问题。 您正在加载检索时的所有完整对象。这将大大减慢速度。如果您不需要实现整个对象,那么我建议您重新打开 -setReturnsObjectsAsFaults:-setFetchBatchSize: 的设置可能没有达到您期望的效果。如果您想限制返回的结果数量,请使用-setFetchLimit:NSArray 结果中创建-mutableCopy 没有任何价值。我怀疑你是从书中得到的,建议你停止这样做。

【讨论】:

感谢马库斯的回复。我正在设置一个谓词。我在调用函数时发送谓词。我将研究“setReturnsObjectAsFaults”以了解如何使用它。另外,感谢您指出 -mutableCopy.. 我想知道它如何影响我的表现.. @learner2010,-mutableCopy 不会对性能产生太大影响,但它是错误的,因为它没有做任何有用的事情。不幸的是,有一个糟糕的例子被传播开来,我怀疑这就是你从那里得到它的(我看到它很多 很多)。设置获取限制并作为错误(空对象)返回将是您在正确格式化的NSPredicate 之外的最大性能提升。你的NSPredicate 是什么样的? 这是我的谓词的样子.. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"users == %@ && (startDate <= %@ && endDate >= %@)", objUser, todayDate, pastDate]; 谓词看起来不错,尽管我会将users 比较切换到末尾,以便它首先进行数字比较。您在这里处理多少数据? Core Data 中有多少条记录? 500-600 条记录对 Core Data 来说不算什么,应该几乎是瞬时的。这些记录中有二进制数据吗?它们有多大?【参考方案2】:

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

您需要一次访问所有结果吗?如果您一次只需要一个小数字,则只能检索 NSManagedObjectID 的:

[request setResultType:NSManagedObjectIDResultType];

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

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

[request setIncludesPropertyValues:NO];

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

或者,您是否需要将排序作为提取的一部分执行,或者一旦对象在内存中,您是否可以以某种方式更快地执行此操作?

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

【讨论】:

以上是关于从核心数据数据库中检索数据的替代方法 - ios的主要内容,如果未能解决你的问题,请参考以下文章

核心数据关系,如何从关系中插入和检索数据

我可以从服务器检索数据并将其存储在核心数据中吗?

我们如何检索在 iOS 中使用核心数据保存的数据

在swift ios中再次运行应用程序后核心数据显示故障记录?

如何从核心数据中获取数据并在表格视图中显示 iOS 6

核心数据添加和检索到多个表如何