核心数据的“重复密钥更新”

时间:2010-07-02 20:02:16

标签: iphone iphone-sdk-3.0 core-data ios4

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

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

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

2 个答案:

答案 0 :(得分:2)

最简单的答案是针对Core Data上下文运行查询,并在对象存在时将其返回。这是解决问题的最有效且最不容易出错的解决方案。

您无需创建单独的NSManagedObjectContext并尝试处理合并策略,这是尝试解决此类简单问题的一种非常低效且危险的方法。

Core Data会在后台为您处理大量缓存。如果您正在尝试检索刚刚创建的对象,那么它很可能仍然位于缓存中,因此对查询的响应几乎是即时的。

注意

我再次回到这两个示例项目来提交针对他们的错误,并注意到他们已经更新,最终删除了创建新上下文的建议。他们现在正在使用适当的NSUndoManager和单个上下文。

答案 1 :(得分:0)

修改

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

担心您的对象生命周期。什么时候创建实例?什么时候被摧毁?是什么让您的实例与众不同使用书籍作为示例实体,书籍具有ISBN,这是识别标题的唯一方式,但是每个标题的许多副本可以存在。您的实体模型中有两个选项,您可以为每个标题副本创建单独的实例,或者让一个实例具有计数属性。

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