如果 iPhone 应用程序中不存在,则在表中插入记录
Posted
技术标签:
【中文标题】如果 iPhone 应用程序中不存在,则在表中插入记录【英文标题】:Insert record in table if does not exist in iPhone app 【发布时间】:2011-11-27 19:03:06 【问题描述】:我正在从一个 url 获取一个 json 数组并将数据插入到一个表中。由于 url 的内容可能会发生变化,我想再次连接到 url 并使用 sqlite3 检查更新并在 y 表中插入新记录。
我面临的问题是:
1) 我的表没有主键
2) 网址列出了当天的更改。因此,如果我多次运行我的应用程序,当我在数据库中插入值时,我会得到重复的条目。我想检查应该删除的重复条目的日期。这个问题可以通过添加约束来解决,但是由于url本身有重复值,我觉得很难。
【问题讨论】:
【参考方案1】:如果您没有主键或您可以使用的东西对每条记录都是唯一的,我可以看到您可以这样做的唯一方法是,当您获取新数据时,您会遍历新条目检查数据库中是否已经存在完全相同的数据。如果没有,则添加它,如果有,则跳过它。
您甚至可以自己为每个条目创建一个唯一键,该键是表中每一列的串联。这样您就可以快速检查该条目是否已存在于数据库中。
【讨论】:
【参考方案2】:根据您的设置,我看到两种可能性:
您将列设置为 UNIQUE(可以通过 PRIMARY KEY 或不通过)。在这种情况下,您可以使用 ON CONFLICT 子句:
http://www.sqlite.org/lang_conflict.html
如果您觉得这个结构有点混乱,您可以改用“插入或替换”或“插入或忽略”,如下所述:
http://www.sqlite.org/lang_insert.html
您没有将列设置为 UNIQUE。在这种情况下,您需要先 SELECT 来验证重复数据,然后根据结果 INSERT、UPDATE 或什么都不做。
【讨论】:
【参考方案3】:处理此问题的更常见且更可靠的方法是将时间戳与服务器上的每个数据项相关联。当您的应用程序询问服务器时,它会提供与上次同步时间相对应的时间戳。然后,服务器查询其数据库并返回时间戳晚于应用程序提供的时间戳的所有值。然后它还会返回一个新的时间戳值供应用存储,以在下次同步时使用。
【讨论】:
以上是关于如果 iPhone 应用程序中不存在,则在表中插入记录的主要内容,如果未能解决你的问题,请参考以下文章