CoreData查询

时间:2013-02-08 17:58:25

标签: iphone ios objective-c xcode core-data

我创建了一个CoreData模型并定义了我的实体和属性。 我还创建了一个符合<NSFetchedResultsControllerDelegate>的NSObject类(名为dbInterface),并添加了以下对象

NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;

这是我迷失的地方。我现在如何从创建的sqlite3文件中获取数据?

我的查询,如果这是正确的术语,则需要根据条件从我的某个实体中选择某些记录。我不知道如何在CoreData中编写查询或任何类型。

1 个答案:

答案 0 :(得分:9)

您可能不需要NSFetchedResultsController。结果控制器通常与UITableViewController一起用作辅助对象来填充表。

如果这是您想要的,请继续。但是,如果您只是想从核心数据上下文中获取实体,那么您只需要一个NSFetchRequest。假设您有一个名为Person的核心数据对象。让我们说我们想要所有名为“Ryan”的实体

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Person"];

NSString *nameToGet = @"Ryan";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", nameToGet];
[fetch setPredicate:predicate];

NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:fetch error:&error];
if(results) {
    NSLog(@"Entities with that name: %@", results);
    for(Person *p in results) {
        NSLog(@"person = %@", p);
    }
    return results;
} else {
    NSLog(@"Error: %@", error);
}

return nil;

所以你创建了一个获取请求。 NSPredicate就像SQL语句的where条件。因此,您可以使用格式(there are tons of options for creating predicates)创建谓词。设置请求的谓词,然后告诉您的managedObjectContext执行获取请求。请求的任何结果都将在返回的数组中。数组中的每个对象都是Person类型的对象。

如果您希望使用NSFetchedResultsController,它基本上是相同类型的东西。但是,您使用1个不可变的提取请求创建控制器,因此它始终获取相同的数据。如果您需要不同的数据,则需要创建另一个控制器。如果你坚持只使用NSFetchRequests(我从我的UI中编写数据层,所以使用控制器对我来说不是很有用),你可以查询你想要的任何数据并返回结果。