CoreData 无法完成以下错误:

2024-02-21

我有一个非常烦人的问题,我似乎无法解决。

当我发送一条消息并保存到核心数据时,我有一个视图,完成后它会向数据库询问随机消息(句子)并将其保存到数据库中的另一行。

如果我对最后一部分进行硬编码,而不从数据库中获取数据,那么它工作得很好,但是一旦我从数据库中获取随机行,它就会变得疯狂。

在我的 AppDelegate.m 中:

- (void)save {
    NSAssert(self.context != nil, @"Not initialized");
    NSError *error = nil;
    BOOL failed = [self.context hasChanges] && ![self.context save:&error];
    NSAssert1(!failed,@"Save failed %@",[error userInfo]);
}

- (NSString*)selectRandomSentence
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentences" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];

    NSError *error = nil;
    NSUInteger count = [self.context countForFetchRequest:request error:&error];

    NSUInteger offset = count - (arc4random() % count);
    [request setFetchOffset:offset];
    [request setFetchLimit:1];

    NSArray *sentenceArray = [self.context executeFetchRequest:request error:&error];

    [request release];

    return [[sentenceArray objectAtIndex:0] sentence];
}

- (NSManagedObjectContext *)context {

    if (_managedObjectContext != nil)
        return _managedObjectContext;

    NSPersistentStoreCoordinator *coordinator = [self coordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }

    return _managedObjectContext;
}

在我的 ChatController.m 中:

- (void)didRecieveMessage:(NSString *)message
{
    [self addMessage:message fromMe:NO];
}

#pragma mark -
#pragma mark SendControllerDelegate

- (void)didSendMessage:(NSString*)text {
    [self addMessage:text fromMe:YES];
}

#pragma mark -
#pragma mark Private methods

- (void)responseReceived:(NSString*)response {
    [self addMessage:response fromMe:NO];
}

- (void)addMessage:(NSString*)text fromMe:(BOOL)fromMe {
    NSAssert(self.repository != nil, @"Not initialized");
    Message *msg = [self.repository messageForBuddy:self.buddy];
    msg.text = text;
    msg.fromMe = fromMe;

    if (fromMe)
    {
        [self.bot talkWithBot:text];
    }

    [self.repository asyncSave];

    [self.tableView reloadData];
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:[self.buddy.messages count] - 1] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

在我的 OfflineBot.m 中:

- (void)talkWithBot:(NSString *)textFromMe
{
    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [self didRecieveMessage:[delegate selectRandomSentence]];
}

- (void)didRecieveMessage:(NSString *)message
{
    if ([self.delegate respondsToSelector:@selector(didRecieveMessage:)])
        [self.delegate didRecieveMessage:message];
}

存储库.m

- (Message*)messageForBuddy:(Buddy*)buddy {
    Message *msg = [self.delegate entityForName:@"Message"];
    msg.source = buddy;
    [self.delegate.managedObjectContext refreshObject:buddy mergeChanges:YES];
    return msg;
}

- (void)asyncSave {
    [self.delegate save];
}

错误:

2012-08-10 00:28:20.526 聊天[13170:c07]* 断言失败 -[AppDelegate保存],/Users/paulp/Desktop/TestTask/Classes/AppDelegate.m:28 2012-08-10 00:28:20.527 聊天[13170:c07] *由于未捕获而终止应用程序 异常'NSInternalInconsistencyException',原因:'保存失败 {类型=不可变字典,计数= 2, 条目=> 1:{内容= “NSAffectedObjectsErrorKey”} = ( “(实体:句子;id:0x6b8bf10; 数据:)" ) 2 : {内容 = "NSUnderlyingException"} = CoreData 无法满足以下错误 '0x6b8bf10 '}

我究竟做错了什么?

Update


唔。您是否正确实施了以下并发操作本指南 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html? 您看到的问题是跨多个线程使用核心数据时的常见问题。对象在您的“后台上下文”中被删除,然后它被另一个上下文访问。呼唤[context processPendingChanges]在删除之后但保存之前的背景上下文中可能会有所帮助。

还有一个关于优化核心数据性能的 WWDC 2010 会议 (137),其中涉及到一些删除。

当您执行 fetch 时,Core Data 返回与您提供的谓词匹配的对象集合。这些对象实际上尚未设置其属性值。当您访问某个属性时,核心数据会返回到存储以“触发故障” - 使用存储中的数据填充该属性。当 Core Data 前往存储区获取对象的属性值,但持久存储区中不存在该对象时,会发生“无法完成故障...”异常。被管理对象上下文thought它应该存在,这就是为什么它可以尝试故障 - 这就是问题所在。导致抛出异常的上下文不知道该对象已被其他对象(例如另一个上下文)从存储中删除。

请注意,上述并发指南现已过时,您应该使用父子上下文和私有队列并发,而不是旧的线程限制模型。由于多种原因,亲子环境不太可能遇到“无法完成错误......”的情况。请提交文档错误或使用反馈表来请求更新并发指南。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoreData 无法完成以下错误: 的相关文章

随机推荐

  • 如何将列表中的所有元素划分在一起

    例如 a 1 2 3 4 5 6 我想要做 1 2 3 4 5 6 我尝试过使用operator div函数 但似乎没有给出正确的结果 顺便说一句 我对 python 还很陌生 您可以使用reduce https docs python o
  • 动态“case_when”允许不同数量的条件和条件本身

    我正在寻找一种动态方法来指定一些 条件参数 然后将其提供给case when操作或其他更适合该问题的操作 我的目标是将条件规范与 case when 调用分开 例如这样用户只需在文本文件或 R 中的列表中输入条件 然后我将获取该信息并将其提
  • 防止图像缓存在浏览器中

    我有一个 浏览图片 功能 其中有缩略图 当用户单击它时它会展开 现在 这两个图像都存储在不同大小的单独虚拟目录中 较大的是 200 200 px 当我点击放大时 它仍然只显示较小的图像 而不是 200 200 的图像 您可以将随机 URL
  • Django - 通过模型名称获取 ContentType 模型(通用关系)

    我现在正在思考这个问题一段时间 我正在创建一个聊天应用程序 在 chat models 中指定了 Room 类 但是 Room 可以与我的项目中的任何内容相关 因为它在外键中使用通用关系 有没有办法只知道模型名称就知道 Room 与哪个模型
  • 如何在 MySQL GROUP BY 子句中排序或选择行?

    我有一个这样的表 id number otherfields 664 48 aaa 665 49 bbb 666 55 ccc 667 48 ddd 我的查询分组为number字段 我希望它选择第一个 最低 id 这样数据就出来了ccc a
  • Angularjs - 自定义 $resource

    我用角 resource用于 REST 服务 由于我的 get 响应中的怪癖 我无法将 resource 服务用于 CRUD 应用程序 创建一个新对象work Card的day 类似于 var newCard new CreditCard
  • Newtonsoft 中的 JSON null 处理问题

    我有一个问题null交易时处理Newtonsoft json 我想检查结果是null或不 基于此我想处理一些情况 我的代码如下 try var response GetApiData Post getApiBaseUrl data ToSt
  • Alt+Enter 停止在 IntelliJ 中处理 Dart 文件

    构建 Flutter 应用程序时ALT Enter键盘快捷键非常方便 不仅可以调出快速修复 还可以调出弹出菜单来包装 删除小部件 在我跑步之前它工作得很好flutter upgrade并更新了 IntelliJ 中的 Dart 和 Flut
  • 如何测试Oracle目录的读/写文件系统权限?

    假设您创建一个目录 例如 CREATE OR REPLACE DIRECTORY EXT DATA FILES AS data ext data files GRANT READ WRITE ON DIRECTORY SYS EXT DAT
  • Delphi中GetLastError和FormatMessage的正确用法是什么?

    我在 Delphi 2006 也是 Delphi 7 中使用第三方组件时遇到问题 在执行对该组件的函数调用时出现 未指定错误 您是否有在 Delphi 中使用 GetLastError 和 FormatMessage 的示例代码 这将允许我
  • ASP.Net MVC 4 的 WebAPI 未正确绑定复选框?

    我正在将 WebAPI 合并到我的开发中 并将所有表单提交发布到 WebAPI 控制器 我注意到复选框没有正确绑定到模型 我有一个表格使用 Html CheckBoxFor m gt m HasVideo 它生成一个复选框和一个隐藏的表单元
  • 反应式表单,检查用户名是否存在

    我在 Ionic Firebase 中遇到问题 验证器的值采用反应形式 特别是我有下面的这 2 个函数 用于检查 firebase 实时数据库中的用户名是否存在 这两个函数返回 Promise 布尔值 export class Userna
  • 以编程方式更改 IE 设置

    我正在尝试制作一个 Windows 应用程序 将 URL 添加到 IE 的 受信任站点 中 这部分有效 解决方案 http www nakov com blog 2009 05 15 c code for changing internet
  • PySimpleGUI 滑块有小数范围吗?

    我需要某种方法来在 PySimpleGUI 中的滑块上方显示十进制值 我已经尝试过输入十进制值 但是当我这样做时它会抛出错误 import PySimpleGUI as sg layout sg Slider range 850 999 d
  • 将 AjaxOnlyAttribute 和 ChildActionOnlyAttribute 组合到一个操作过滤器中

    我希望能够在控制器上标记一个动作 以便通过 ajax 调用和 RenderAction 来调用 问题在于这两个属性派生或实现不同的抽象 一种出路是下一个 AjaxOnly PartialViewResult GetViewAjax int
  • 当不使用字符串操作时,GCC 11 给出 -Wstringop-overflow

    这是我的代码 test c include
  • Swift 中的纯类协议

    我希望我的一些课程 不是全部 符合使用 仅限类的协议 https developer apple com library ios documentation Swift Conceptual Swift Programming Langua
  • 使用 MS Access 中的 GUID pk 插入 SQL Server 表

    我正在将数据库从 Access 后端迁移到 SQL Server 后端 同时保留 Access 前端 其中一张表设置了其 PK 的复制 ID 作为 Access DB 我们可以将值插入到该表中 而无需引用 PK 字段 因为 Access 会
  • 使用 jquery 选择最近的锚元素

    我有一张带有一个链接的表 如下所示 td a href class topiclink item Topic a td 我想选择 item topic的数据 我尝试使用 topiclink click function e var val
  • CoreData 无法完成以下错误:

    我有一个非常烦人的问题 我似乎无法解决 当我发送一条消息并保存到核心数据时 我有一个视图 完成后它会向数据库询问随机消息 句子 并将其保存到数据库中的另一行 如果我对最后一部分进行硬编码 而不从数据库中获取数据 那么它工作得很好 但是一旦我