gpt4 book ai didi

ios - 核心数据获取谓词 nil 检查失败/意外结果?

转载 作者:可可西里 更新时间:2023-11-01 05:00:28 26 4
gpt4 key购买 nike

我有一个包含数千个实体的核心数据层,不断同步到服务器。同步过程使用获取请求来检查 deleted_at 以实现软删除目的。在 performBlockAndWait 调用中有一个执行保存操作的上下文。关系映射由 RestKit 库处理。

CoreDataEntity类是NSManagedObject的子类,也是我们所有不同的核心数据对象类的父类(super class)。它具有我们所有实体都继承的一些属性,例如 deleted_at、entity_id 以及所有样板获取和同步方法。

我的问题是一些提取请求似乎在修改对象后返回不一致的结果。例如在删除对象后(将 deleted_at 设置为当前日期):

[CoreDataEntity fetchEntitiesWithPredicate:[NSPredicate predicateWithFormat:@"deleted_at==nil"]];

返回 deleted_at == [NSDate today] 的结果

我已经通过额外循环结果并删除设置了 deleted_at 的实体成功地解决了这个问题,但是我无法解决相反的问题:

[CoreDataEntity fetchEntitiesWithPredicate:[NSPredicate predicateWithFormat:@"deleted_at!=nil"]];

在相同条件下返回一个空数组,阻止服务器同步成功。

我已经确认在对象上设置了 deleted_at,并且上下文保存成功。我只是不明白在哪里重置导致过时结果的任何缓存?

感谢您的帮助!

编辑:添加更多信息,似乎一旦这些对象之一损坏,让它注册的唯一方法就是再次修改值。这可能是某种核心数据索引在修改值时不更新吗?

更新:这似乎是 RestKit 的问题 https://github.com/RestKit/RestKit/issues/2218

最佳答案

您显然正在对 Core Data 使用一些语法糖扩展。我想你的情况是 SheepData,对吧?

fetchEntitiesWithPredicate: 实现如下:

+ (NSArray*)fetchEntitiesWithPredicate:(NSPredicate*)aPredicate
{
return [self fetchEntitiesWithPredicate:aPredicate inContext:[SheepDataManager sharedInstance].managedObjectContext];
}

您确定 [SheepDataManager sharedInstance].managedObjectContext 接收到您对对象所做的所有更改吗?它是接收保存通知,还是您的保存上下文的子上下文?

尝试用这个替换你的 fetch one-liner:

[<your saving context> performBlockAndWait:^{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"CoreDataEntity"];
request.predicate = [NSPredicate predicateWithFormat:@"deleted_at==nil"];

NSArray *results = [<your saving context> executeFetchRequest:request error:NULL];
}];

关于ios - 核心数据获取谓词 nil 检查失败/意外结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31082661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com