• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - XCode iOS6 CoreData NSFetchedResultsController 无法获取新数据

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:06:23 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有这段代码:

- (void) fetchRecordsStaringFromdouble)start limitdouble)limit whereFieldsNSArray*)whereFields haveValuesNSArray*)whereValues sortByNSString*)sortField ascendingBOOL)isascending delegateEventBOOL)delegateEvent{
NSFetchRequest *_fetchRequest = [[NSFetchRequest alloc] init];
[_fetchRequest setEntity:self.entityDescription];
// Create the sort descriptors array.
// Default sort is ID
if (sortField == NULL) {
    sortField = @"id";
}
NSSortDescriptor *authorDescriptor = [[NSSortDescriptor alloc] initWithKey:sortField ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:authorDescriptor, nil];
[_fetchRequest setSortDescriptors:sortDescriptors];
if (whereFields != Nil && whereValues != Nil && ([whereFields count] == [whereValues count])) {
    NSMutableString *predicateString = [[NSMutableString alloc] initWithString""];
    for (int index = 0; index < [whereFields count]; index++) {
        [predicateString appendFormat"%@==%@", whereFields[index], whereValues[index]];
        if (index < [whereFields count] - 1) {
            [predicateString appendString" AND "];
        }
    }
    // Delete old cache to make sure always get new data
    [NSFetchedResultsController deleteCacheWithName:nil];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
    [_fetchRequest setPredicate:predicate];
} else {
}
self.fetchRequest = _fetchRequest;
self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.context sectionNameKeyPath:nil cacheName:nil];
self.fetchResultController.delegate = self;
NSError *_error;
if (delegateEvent) {
    if ([self.delegate respondsToSelectorselector(CoreDataEntityRequestStartEvent::]) {
        [self.delegate CoreDataEntityRequestStartEvent:self :self.fetchRequest :self.fetchResultController];
    }
    if (![self.fetchResultController performFetch:&_error]) {
        if ([self.delegate respondsToSelectorselector(CoreDataEntityRequestErrorEvent:]) {
            [self.delegate CoreDataEntityRequestErrorEvent:self :_error];
        }
    } else {
        if ([self.delegate respondsToSelectorselector(CoreDataEntityRequestSuccessEvent::]) {
            [self.delegate CoreDataEntityRequestSuccessEvent:self :self.fetchRequest :self.fetchResultController];
        }
    }
    if ([self.delegate respondsToSelectorselector(CoreDataEntityRequestEndEvent::]) {
        [self.delegate CoreDataEntityRequestEndEvent:self :self.fetchRequest :self.fetchResultController];
    }
} else {
    [self.fetchResultController performFetch:&_error];
}
}

上面的方法执行时会从SQLITE数据库中获取数据,这里没问题, 但是当我使用外部 SQLITE 编辑器或通过其他方式更改 SQLITE,然后使用相同的参数再次执行时,它无法获取新数据并保留生成的旧数据,除非我重新启动应用程序。

我到处找,可能是因为缓存,但正如你所见,我已经清除了缓存,但仍然无法获取新数据。


感谢您的回复, 答案是:只是为了测试,

这是实际情况: 例如,在屏幕 UITableView 中,从互联网获取数据(数据不完整),将其存储在数据库中然后加载并显示在 View 中,然后当点击一个单元格时,将从互联网获取所选单元格的完整数据,更新数据库,并将其显示在其他屏幕上。当返回 UItableView 并从数据库重新加载时,由于之前的更新,记录集应该被更改,所以当用户在同一个单元格上重新点击时,不需要从互联网获取数据,因为我们已经完成了选定单元格的数据。但是....正如我在上面的问题中解释的那样,NSFetchResultController 没有提供新数据,即使在 SQLITE 文件更新之后!



Best Answer-推荐答案


好的,对不起,很抱歉,这就是我为将来遇到此问题的任何人解决问题的方法,所有功劳都归于这里的每个人,谢谢。

在执行获取请求时,请确保删除旧缓存

[NSFetchedResultsController deleteCacheWithName:nil];

然后对于所有在 fetchResultController 中获取的对象,使用选项 mergeChanges YES 调用 refreshObject

for (int i = 0; i < [[self.fetchResultController fetchedObjects] count]; i++) {
[self.context refreshObject:[[self.fetchResultController fetchedObjects] objectAtIndex:i] mergeChanges:YES];
}

这将确保您每次执行获取请求时都能获取新数据

关于ios - XCode iOS6 CoreData NSFetchedResultsController 无法获取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18820494/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap