如何仅获取Core Data中的第一条记录?

Boo*_*oon 39 iphone core-data

我正在使用Core Data,我只想获取数据集中的第一条记录,是否可能?

Tim*_*Tim 75

您可以setFetchLimit:在NSFetchRequest上使用该方法来限制提取的记录数.所以如果你只想要第一条记录:

// Given some existing NSFetchRequest *request and NSManagedObjectContext *context:
[request setFetchLimit:1];
NSError *error;
NSArray *results = [context executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)

请注意,调用executeFetchRequest:error:仍将返回NSArray; 你仍然需要先从数组中拉出第一个对象才能使用它,即使它是一个大小为1的数组.

另一种效率较低的方法:根据您的商店类型,限制获取可能会产生显着的性能加速.但是,如果它没有,或者您并不担心性能,并且稍后可能会使用更多数据,则可以提前将第一个对象拉出阵列:

// Given some existing result NSArray *results:
NSManagedObject *firstManagedObject = [results firstObject];
Run Code Online (Sandbox Code Playgroud)

如果您确定该数组中有一个对象,您甚至可以通过执行以下操作将其放入另一个数组(例如,在UITableViewController中使用):

// Again, with some NSArray *results:
NSArray *singleObjectResult = [results subarrayWithRange:NSMakeRange(0, 1)];
Run Code Online (Sandbox Code Playgroud)


Cra*_*hon 13

当然,这部分取决于"第一条记录"的含义.您可能不仅需要将获取限制设置为1,还需要在获取中对结果进行排序.

例如,User我的数据库中有一堆对象,我想找到第一个创建帐户的人.(假设我已经有了模型User,包括一个名为的属性accountCreatedDate.)

NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"accountCreatedDate" ascending:YES]; // ascending YES = start with earliest date

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = entity;
request.sortDescriptors = @[ sortDescriptor ];
request.fetchLimit = 1;

NSError *error;
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];

User *result = fetchResults.firstObject; // nil on failure; check value of 'error'
Run Code Online (Sandbox Code Playgroud)

如果在限制获取之前没有对结果进行排序,则无法确定将"首先"返回哪些结果.