将已存在的行添加到sqlite3而不会出现异常

时间:2011-11-08 07:33:15

标签: android exception sqlite constraints

我在我的Android应用程序上安装了sqlite DB来保存预订。 其中一个表包含每个预订的标题,可能包含预订的几个部分,每个预订都有RES_ID,而每个部分都有PART_ID 主表只包含RES_ID作为主键,我有其他表包含每个表中的部分PART_ID和RES_ID都是主键

我有一个案例,我将几个部分对象插入数据库,所以最终会发生的事情是我尝试向表中插入两个或多个具有相同RES_ID的行。 我自然得到SQLiteException,约束违规,因为已经有一行主键。

是否有SQL语句或java方法\ const将通知SQLite失败是正常的,我不知道 不想要例外吗? (仅适用于该表)

4 个答案:

答案 0 :(得分:1)

不应该这样做:

INSERT((SELECT v1 AS c1,v2 AS c2,...,vn AS cn)EXCEPT tablename)INTO tablename;

或类似的:

INSERT((SELECT v1 AS c1,v2 AS c2,...,vn AS cn)WHERE NOT EXISTS(SELECT * FROM tablename WHERE pkc1 = pkv1 AND pkc2 = pkv2 AND ... AND pkcj = pkvj))INTO表名;

答案 1 :(得分:1)

如其他人所述,可以使用多列主键。但是应该注意的是,如果你有一些不是由密钥引入的功能依赖,你应该考虑规范你的关系。 http://en.wikipedia.org/wiki/Database_normalization

或者您可以在表格中找到唯一的密钥。 http://www.w3schools.com/sql/sql_unique.asp

答案 2 :(得分:0)

当我的问题正确时,您正在寻找insert or replaceClick

replace是此的捷径。

答案 3 :(得分:0)

可能还有另一种方法,但确实使用替换而不是INSERT可以很好地完成工作。 使用sqlite3控制台客户端检查我能够在谈到的表中插入一个不存在的行。如果该行已存在,则无论如何都会更新这些值。

10x Jeff和janoliver!