NSManagedContext 返回旧数据而不是新数据

Posted

技术标签:

【中文标题】NSManagedContext 返回旧数据而不是新数据【英文标题】:NSManagedContext returning old data instead new 【发布时间】:2017-07-28 06:51:05 【问题描述】:

在我的应用程序中,我使用了 NSManagedContext 的双模型。 有一个孩子managedObjectContextNSMainQueueConcurrencyType 和父母 writerManagedObjectContextNSPrivateQueueConcurrencyType 将数据保存到 PersistentStoreCoordinator。我能够将数据保存在数据库中,但是在检索时我得到的是旧值而不是新值。

下面的代码是将上下文保存到parent context,然后保存到PersistentStoreCoordinator

 [managedObjectContext performBlock:^
            //push to parent
            //NSLog(@"pushing to parent context (writer context)");
            NSError * error;
            if([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
                NSLog(@"main Save Error: %@", [error localizedDescription]);
            

            //NSLog(@"pushing to persistentstore");
            [self.writerManagedObjectContext performBlock:^
                //push to parent
                NSError * error;
                if([self.writerManagedObjectContext hasChanges] && ![self.writerManagedObjectContext save:&error])
                    NSLog(@"writer Save Error: %@", [error localizedDescription]);
                
            ];
        ];

在 stack-overflow 上找到了相同的 issue,但它的答案对我的问题没有帮助。有人知道怎么做吗?

【问题讨论】:

你检查过你的 db 文件是否在任何 SQLite 浏览器中更新为最新值? 【参考方案1】:

将主上下文的automaticallyMergesChangesFromParent 设置为YES。

写入上下文直接与 PersistentStoreCoordinator 对话,因此无法通过主上下文知道有任何变化。上下文有一个缓存,并不总是访问数据库来获取数据。在ios 10之前你需要监听通知并拨打mergeChangesFromContextDidSaveNotification;在 iOS 10 中添加了 automaticallyMergesChangesFromParent,这让这变得更容易了。

【讨论】:

以上是关于NSManagedContext 返回旧数据而不是新数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g DB 返回流而不是字符串

Eloquent - 编辑表格行并返回新结果数据 - 检索旧数据

TPL 数据流使用旧数据而不是最新数据

如何每次将新数据保存到我的 plist 文件而不是替换旧数据?

可以将 NSmanagedObject 移动到另一个 NSManagedContext 吗?

在 IOS 9 及更低版本中创建 nsmanagedcontext