【问题标题】:FetchRequest returning duplicate results on subsequent executionsFetchRequest 在后续执行中返回重复的结果
【发布时间】:2012-08-05 23:55:02
【问题描述】:

我在选项卡控制器的第二个选项卡上设置了以下代码。我第一次进入选项卡时,按预期正确获取了我的数据。但是,如果我离开选项卡并返回,则提取请求返回的 array 包含双倍条目。它返回的每个对象都是重复的。如果我离开选项卡并再次返回,则条目会再次重复,每个条目都给我 3 个。我的请求做错了什么会导致这种情况发生?

- (void)viewWillAppear:(BOOL)animated {
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:delegate.managedObjectContext];
    [fetchRequest setEntity:entity];

    // sort the results, since we want the most recent entry first
    NSSortDescriptor *dateSort = [[NSSortDescriptor alloc] initWithKey:@"key" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:dateSort];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSError *error;
    NSMutableArray *array = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    NSLog(@"error %@",[error localizedDescription]);
    self.fetchedObjects = [array copy];
    [array removeAllObjects];

    [self.tableView reloadData];
}

更新:我切换到 NSFetchedResultsController,这解决了我的问题。

【问题讨论】:

    标签: ios ios5 core-data


    【解决方案1】:

    没有立即说明为什么会发生这种情况,但围绕实际 fetch 本身的可疑编码表明您的委托方法或控制器的其他部分可能存在一些错误。

    您是否也在使用获取结果控制器?您稍后会更改 fetchObjects 集合吗?

    数据库实际上是否包含所有这些额外的对象,还是只是这个控制器中的数组?

    另外,请注意,在 viewWillAppear 中完成所有这些工作可能不是一个好的选择。

    【讨论】:

    • 不,我没有使用获取结果控制器。我没有更改集合,只是在表格视图中显示它。但是可以从另一个选项卡添加数据,这就是我在 viewWillAppear 中重新获取的原因。数据库不包含额外的对象,只包含后续调用的数组。
    • 你应该在这个控制器中的每个方法处放置一个断点,然后查看数组中的计数在哪里发生了变化。你碰巧有 setFetchedAttributes 的自定义实现吗?
    • 执行 fetch 时计数翻倍。如果我在获取之前和之后检查数组,我可以看到重复的条目。在第一次执行时,它会返回正确的金额。不,我没有自定义实现。
    • 你在说什么计数?抱歉,但如果您需要进一步的帮助,您将需要提供更多/更好的信息......比如日志跟踪,或调试器堆栈跟踪代码的确切发生位置......否则它会在黑暗中猜测。我在您发布的内容中看到的唯一奇怪的事情是尴尬的可变/复制/删除舞蹈。它没用,而且令人困惑。
    • 对不起...该评论听起来很粗鲁。我不是那个意思。
    【解决方案2】:

    如果您尝试将代码更改为 self.fetchedObjects = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 会怎样

    您能否向我们展示更多代码,包括实现的UITableViewDataSourceUITableViewDelegate methods

    【讨论】:

      【解决方案3】:

      切换到 NSFetchedResultsController 解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多