Iphone &引用;“关于重复密钥更新”;核心数据

Iphone &引用;“关于重复密钥更新”;核心数据,iphone,iphone-sdk-3.0,core-data,ios4,Iphone,Iphone Sdk 3.0,Core Data,Ios4,我想知道是否有一些类似的功能或方法可以像MySQL一样使用核心数据执行“重复密钥更新”功能 我想做的是在用户每次按下按钮时将对象保存到数据库中。但是如果按钮已经按下,我想用一些新值更新行,而不是添加新行 我目前知道的唯一方法是从数据库中读取行,查看该行是否存在,然后更新它。。否则,添加新行。这样做似乎有点不好,我错了吗?编辑 请记住,核心数据框架管理对象图的持久性。它不是sqlite数据库的接口 担心对象的生命周期。什么时候创建实例?什么时候销毁?是什么使您的实例独一无二?以书籍为例,一本书有一

我想知道是否有一些类似的功能或方法可以像MySQL一样使用核心数据执行“重复密钥更新”功能

我想做的是在用户每次按下按钮时将对象保存到数据库中。但是如果按钮已经按下,我想用一些新值更新行,而不是添加新行

我目前知道的唯一方法是从数据库中读取行,查看该行是否存在,然后更新它。。否则,添加新行。这样做似乎有点不好,我错了吗?

编辑

请记住,核心数据框架管理对象图的持久性。它不是sqlite数据库的接口

担心对象的生命周期。什么时候创建实例?什么时候销毁?是什么使您的实例独一无二?以书籍为例,一本书有一个ISBN,这是识别一个书名的独特方式,但每个书名都可以有许多副本。在实体模型中有两种选择,可以为标题的每个副本创建单独的实例,也可以有一个带有count属性的实例


示例项目并使用
NSUndoManager
跟踪视图之间的状态更改。

最简单的答案是对核心数据上下文运行查询,并获取对象(如果存在)。这是解决该问题最有效、最不容易出错的解决方案

您不需要创建一个单独的
NSManagedObjectContext
并尝试处理合并策略,这是尝试解决这样一个简单问题的一种非常低效和危险的方法

核心数据在后台为您处理大量缓存。如果您试图检索刚刚创建的对象,那么很可能该对象仍位于缓存中,因此对您的查询的响应几乎是瞬时的


我只是再次回到这两个示例项目,对它们提出了一个bug,并注意到它们已经更新,最后删除了创建新上下文的建议。他们现在在适当的地方使用
NSUndoManager
和单个上下文。

停止考虑表中的行。对象只有在插入到上下文或从存储中提取时才能存在。因为我对这一点很陌生,你能给我举个例子说明你的意思吗。。也许是你推荐的链接吧?我完全不同意这种设计。这是非常低效和脆弱的。所指向的示例项目没有显示这个简单问题的最佳解决方案。看我的答案。问题根本就没那么清楚。问题并没有告诉我们是否正在创建新对象,或者只是更新现有托管对象的状态。我会看看更新的项目。感谢您对单独上下文的看法。感谢您的回答。我真的没有时间看样品,因为我的截止日期被挪动了。因此,我将要做的是实施您的建议,然后检查示例项目,看看我可以与NSUndoManager一起做些什么。谢谢大家的回答。你好,保罗·佩伦