问题标签 [nsmanagedobjectcontext]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 撤消在主线程之外执行的核心数据插入
我正在处理一些使用 anNSOperation
来导入数据的代码。我希望用户能够撤消NSManagedObject
在导入操作期间创建的实例。
据我所知,不可能将NSManagedObjectContext
-undoManager
用于在主线程之外执行的任何操作。从Core Data Programming Guide部分的Use Thread Confinement to Support Concurrency,我们有这两个条件:
- 只有 objectID 应该在托管对象上下文之间传递(在单独的线程上)
- 托管对象必须先保存在上下文中,然后才能使用 objectID。
这是有道理的,因为托管对象需要在共享之前从私有存储 ( NSManagedObjectContext
) 移动到公共存储 ( )。NSPersistentStore
不幸的是,该-save:
消息还会导致撤消堆栈中的任何托管对象被删除。从 同一指南的使用核心数据的内存管理部分:
具有未决更改(插入、删除或更新)的托管对象由其上下文保留,直到其上下文被发送 save:、reset、rollback 或 dealloc 消息,或适当数量的撤消来撤消更改。
我已经尝试了几件事来解决这个限制,一切最终都会导致主线程上发生的大部分工作(以及旋转的沙滩球)。非常感激。
--
已提交增强雷达:rdar://problem/8977725
cocoa - 只有在没有关系的情况下才能正确处理对象的删除?
我有一个Person
属于Department
一对多关系的实体。
我希望能够在Department
没有更多Person
s 与之关联时删除它(通过删除Person
实体或更改Person
'sdepartment
属性)。现在,我正在尝试使用以下处理程序来执行此操作NSManagedObjectContextObjectsDidChangeNotification
(目前只是试图查看删除,并适当地删除):
但是,当我删除一个人时,与部门关联的人数不会改变。我没有对Department
实体执行提取。那是我应该做的事情吗?
iphone - 使用选项卡控制器传递托管对象上下文
好吧,我一遍又一遍地试图弄清楚这一点。
我知道最好的做法是让 App Delegate 将托管对象上下文传递给应用程序中的第一个视图控制器,然后让每个后续视图控制器向下传递托管对象上下文。但是,当我在我的应用程序中使用选项卡栏控制器时,我似乎会绕着那个额外的层转头。
我能够弄清楚如何做到这一点的唯一方法是将每个选项卡“Reach Back”的根视图控制器放入应用程序委托中以获取上下文,但据我了解,这是一种糟糕的形式。
objective-c - 以编程方式添加到核心数据实体(如 IB 绑定“添加”)
我有一个核心数据模型,其中包含一个名为clients的实体,该实体由以下属性组成:
如果我单击“添加客户端”按钮并打开以下窗口:
以编程方式同时为每个属性添加新条目的正确方法是什么(与绑定的 IB“添加”按钮如何NSArrayController
与编辑?“添加客户端”窗口中的文本字段绑定到客户端实体的相应属性(仍然缺少一两个) 。我现在的代码是:
这适用于该项目中的其他实体,但不适用于客户端,因为我添加了关系类型(它在控制台中引发 KVC 错误)。我想这是因为我正在解决NSArrayController
而不是解决NSManagedObjectContext
但注释掉的代码对我不起作用。这种尝试是从上一个问题开始的,因为问题发生了很大变化,我正在努力实施给出的建议。我真的需要一个好的起点,而苹果开发文档并没有帮助我理解这一点。
提前致谢!
- - 更新 - -
我在这个问题上解释得很糟糕吗?我是新来的,但认为可能会尝试回答。由于某种原因,谷歌搜索这很困难。我可能通过不相关的谷歌搜索找到了类似于解决方案的东西。幸运的是,它与此有关。
这为客户实体创建了一个全新的条目——我没有意识到我必须为每个属性做一个单独的值。但 KVC 错误仍在继续,我根本找不到解决方案。Apple 开发文档实际上对此很有帮助,这里,并且添加NSBindingDebugLogLevel 1
到“启动时要传递的参数”列表中可以让我详细了解导致问题的确切原因。这是一个NSTableColumn
尚未更新的旧绑定。
objective-c - 将对象添加到底层 nsmanagedobjectcontext 后如何刷新 uitableview/nsmutablearray
我有一个基本的 UITableViewController 显示学校列表,从一个简单的两实体核心数据存储库中获取。tableview 绑定到从 NSManagedObjectContext 加载的 NSMutableArray 学校。
我添加了一个“添加新学校”按钮,它为用户提供了一个用于添加新学校的表单。当用户添加新学校并单击“保存”时,我将新学校对象保存到 NSManagedObjectContext 并从导航堆栈中弹出“添加学校”视图。我被送回原来的 uitableview 并且新学校不在列表中。
我知道我需要在返回时刷新 tableview,但不确定如何。注意:如果我退出模拟器并再次运行程序,则会出现新的学校记录,因此我知道它已正确添加到底层存储中。
很确定我需要实现一个 NSFetchedResultsController ,但这似乎是一个非常简单的代码。
如果 NSFetchedResultsController 是唯一的方法,有人可以指导我查看可能显示此流程的教程或代码清单吗?
非常感谢。
菲尔
uitableview - 保存 NSManagedObjectContext 导致 UITableView 单元格消失
我有以下问题。
我正在编写一个使用 CoreData 和 Apple Recipes 示例作为指南的 RSS 阅读器。我有一个刷新按钮,可以重新下载 RSS 并使用 NSFetchRequest 验证是否有新数据。完成对元素的检查后,我通过 NSManagedObjectContext 保存方法提交更改。
上下文保存后,tableView 消失了!
然后我决定在 tableView 上调用 reloadData 以反映更改。所以,一旦 NSManagedObjectContext 被保存,我调用:
此操作导致单元格在滚动时删除数据,当我弹出视图并返回时,我看到所有更改并且一切正常。
我还阅读了我应该使用 NSFetchedResultsController 的线程之一,并确保 UITableView 是委托,与前一个问题相同。
我究竟做错了什么 ?为什么我看不到更改的地方?为什么单元格的内容被删除?
谢谢!
iphone - 如何在应用程序退出时正确删除“临时”NSManagedObject
我创建了一个临时 NSManagedObject 并将其与主 NSManagedObjectContext 关联。我需要能够在上下文中将其视为功能齐全的对象(执行获取请求等),因此在没有关联上下文的情况下无法创建它。我在 ViewWillDisappear 中包含删除托管对象的逻辑,条件是新的视图控制器不只是被推入堆栈:
除了应用程序退出之外,这似乎在所有情况下都能正确删除托管对象。我尝试删除 viewDidUnload 中的对象,但似乎在应用程序退出时未调用该方法。我考虑过创建第二个托管对象上下文,但希望尽可能避免主要开销。
谢谢,格雷厄姆
core-data - CoreData 将数据重新加载到 UITableView 问题
我又和 CoreData 打架了,我需要你的帮助:P
我正在写一个 RSS 阅读器。设计基于使用 libxml2 库的 Apple TopSongs 示例。
当我的应用程序启动时,我正在检查最后一次更新是什么时候。如果是超过 1 小时前,我会删除当前的持久存储并再次下载所有内容。
可以看到本地的sql文件被删除了。
现在我正在创建一些 NSOperations 从后台的提要中下载信息。
到目前为止,一切都很好。
像每个 RSS 提要一样,有一个更新按钮,用于检查更改并更新 coreData。对于初学者,我决定删除所有内容并重新下载所有内容(我知道效率不高,但是 RSS 提要没有 guid,我需要实现一个哈希函数来确定是否有任何更改)。
所以我所做的基本上是调用与上面相同的代码来删除商店.. 再次重新下载所有 RSS 提要(首次加载应用程序时的逻辑相同)
我正在重新加载表格,但我仍然可以在 tableView 上看到相同的数据,一切都保持不变。
我决定更进一步,在不下载内容的情况下删除商店。
我希望看到空表,但数据仍然存在。
这怎么可能 ?我删除了商店,重新获取并重新加载了数据。
我究竟做错了什么?
iphone - 如何通过 Interface Builder 的 XIB 传递 NSManagedObjectContext
我有一个简单的 iOS 应用程序,在 UINavigationController 下有一个 UIViewController。UIViewController 有一个用于 NSManagedObjectContext 的 IBOutlet。
AppDelegate 有一个用于导航控制器的 IBOutlet - 但不是视图控制器。视图控制器在 XIB 进程中自动实例化(作为导航控制器的子进程)。
使用此设置,如何干净地将应用程序委托的 NSManagedObjectContext 分配或传递给视图控制器的 IBOutlet 属性。有一个导航控制器:) 并且应用程序委托没有 UIViewController 的直接属性。
这是一个奇怪的问题,我想将一个 XIB 组件的属性链接到另一个组件的属性。我所做的大部分 XIB 工作都需要一个属性并将其指向 XIB 中的一个对象,而 XIB 又会在正常过程中被实例化,但在这种情况下,上下文是在应用程序委托中正确创建的,我只是想要在实例化它时将其传递给视图控制器。
xml - NSManagedObject 不插入它:相关的很多
我的 XML 导入要求我在插入之前检查现有对象。换句话说,在确定是否保存之前,我需要将每条记录保存在临时托管数据对象中。*** 注意:请参阅此线程中的最后一个答案:
有没有办法在不插入的情况下实例化 NSManagedObject?
我采用了上面链接中最后一个答案的方法,使用 insertIntoManagedObjectContext:nil 将传入的单记录放入没有上下文的临时对象中。
在我的导入中,我有两个表:一个表记录和紧随其后的多个相关多记录。除了我有相关的许多记录之外,这很好用。
现在我也用 nil 将多表记录插入到他们自己的托管对象中。问题是当我要保存一条记录时,我还创建了多个相关的许多对象。如何保存许多记录?我可以从零上下文中获取它们并循环它们吗?
以下是新记录开始的代码:
以及我即将将单表记录保存到 contect 中的代码:
谢谢