我有一个相对简单的核心数据sqlite数据库.我试图从DB一次获得结果.
NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[...]];
[request setPredicate:[NSPredicate predicateWithFormat:@"flaggedTime != nil"]];
NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"flaggedTime" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[request setFetchLimit:pageSize];
[request setFetchOffset:((pageIndex - 1) * pageSize)];
NSArray* results = [self.context executeFetchRequest:request error:NULL];
Run Code Online (Sandbox Code Playgroud)
pageSize为30,测试数据的pageIndex为1,2,3或4(DB中约有80个项目,因此pageIndex = 4应该不返回任何项目).谓词和排序工作正常,结果成功返回.获取限制也可以正常工作.没有错误返回.
问题:我总是从第一页获得结果,就像没有设置fetchOffset一样.我试图删除谓词和排序但无济于事.我可以使fetchOffset工作的唯一情况是当我使用30以下的值时.当然,这对于分页来说毫无意义...
有人知道为什么吗?我会非常感谢每一个答案.
更新:我说的是iOS.测试4.2和5.0.
更新2:简化问题.
NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[...];
NSError* error = nil;
NSManagedObjectContext* context = [...];
NSUInteger count = [context countForFetchRequest:request error:&error];
assert(error == nil);
NSLog(@"Total count: %u", count);
request.fetchOffset = 0;
request.fetchLimit = …Run Code Online (Sandbox Code Playgroud) 我现在正在努力解决这个问题,到目前为止Apple的文档和SO都没有帮助.我在UIManagedDocument上使用ManagedObjectContext,下面的代码运行正常.然后我决定在AppDelegate中使用Apple的CoreData模板,因此在AppDelegate中创建了模型,持久性存储协调器和上下文.使用AppDelegate的上下文获取是没有问题的,但是后台保存是一个问题.我应该在我保存的线程上有本地上下文,并且根据Apple有相同的持久性存储协调器.但是下面的代码实际上并没有保存数据.请问有人可以提供建议吗?谢谢.
- (void)fetchAndPersist
{
dispatch_queue_t ffetchQ = dispatch_queue_create("ForFetch", NULL);
dispatch_async(ffetchQ, ^{
NSManagedObjectContext *secureManagedObjectContext;
NSPersistentStoreCoordinator *coordinator = [appDelegate persistentStoreCoordinator];
if (coordinator != nil) {
secureManagedObjectContext = [[NSManagedObjectContext alloc] init];
[secureManagedObjectContext setPersistentStoreCoordinator:coordinator];
}
// find missing date
DataManager *dataManager = [[DataManager alloc] init];
NSDate *missingDate = [dataManager findMissingDateFromDate:selectedDate inContext:secureManagedObjectContext];
if (missingDate) {
// fetch and parse data
DataFetcher *dataFetcher = [[dataFetcher alloc] init];
NSDictionary *fetchResponse = [dataFetcher parseDataForDate:missingDate];
// persist it in a block and wait for it
[secureManagedObjectContext performBlock:^{
DataStore *dataStore …Run Code Online (Sandbox Code Playgroud)