我目前正在使用Magical Records保存记录,如下所示:
NSManagedObjectID *objID = [existingItem objectID];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
CustomNSMO *item;
if(newItem) item = [CustomNSMO MR_createEntityInContext:localContext];
else item = [localContext objectWithID:objID];
item.sync = 1;
item.relID = @"Some String";
}completion:^(BOOL success, NSError *error) {
//do something
}];
这很好用。如果我查询已设置 sync 的所有项目,我会收到我期望的结果,即
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(sync >= 1)"];
NSArray *objects = [CustomNSMO MR_findAllSortedBy:@"sync" ascending:YES withPredicate:predicate];
给我一组新的或更新的对象。
然后我(在某些服务器业务之后)希望使用 sync > = 1找到所有结果并将其设置为零。这是奇怪的行为发生的时候。我一直试图通过
在本地环境中获得一系列结果 NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context];
NSArray *objects = [CustomNSMO MR_findAllSortedBy:@"sync" ascending:YES withPredicate:predicate inContext:localContext];
for(CustomNSMO *item in objects) {
item.sync = 0;
}
[localContext MR_saveToPersistentStoreAndWait];
或
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
NSArray *objects = [CustomNSMO MR_findAllSortedBy:@"sync" ascending:YES withPredicate:predicate inContext:localContext];
for (SyncObject *currentObj in objects)
{
currentObj.sync = @0;
}
} completion:nil];
如果首次创建项目时设置了 relID ,那么这一切都很好。我可以编辑项目(更改 relID ),并在所有上下文中观察更改。但是,如果第一次创建项目时它的 relID nil ,那么在使用上面的代码执行以下操作后会出现问题:
1)更新项目,将 nil relID 更改为某些非 nil 值
2)将项目保存到数据库
3)加载项目(通过搜索' sync ')
在除 MR_defaultContext 之外的任何上下文中, relID 保持为 nil 。如果我查看 MR_defaultContext 中的对象,那么我会看到正确更新的 relID 。如果我在不同的上下文中查看它是 nil 。这意味着本地上下文中 sync 的更新会覆盖默认上下文中 relID 的值(将其设置为 nil )。
答案 0 :(得分:1)
一些想法:
if(newItem) item = [CustomNSMO MR_createEntityInContext:context];
应该是:
if(newItem) item = [CustomNSMO MR_createEntityInContext:localContext];
您不想在+saveWithBlock:
内使用不同的上下文。
此外,这一行:
else item = [localContext objectID];
我认为您的意思是[localContext objectWithID:objID]
或[localContext existingObjectWithID:objID error:error]
?
答案 1 :(得分:0)
原来这是我们在Core Data下面使用的数据库存储的一个错误。
https://github.com/project-imas/encrypted-core-data/issues/118