魔法记录:加载要在本地环境中更新的记录

时间:2014-09-19 15:23:28

标签: ios core-data nsmanagedobjectcontext magicalrecord

我目前正在使用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 )。

2 个答案:

答案 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