我有一个带有以下create语句的简单地址表:
"CREATE TABLE " + ADDRESSES_TABLE + " (" +
KEY_ADDRESS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_ADDRESS_COUNTRY + " TEXT, " +
KEY_ADDRESS_CITY + " TEXT, " +
KEY_ADDRESS_STREET + " TEXT, " +
KEY_ADDRESS_HOUSE + " TEXT, " +
KEY_ADDRESS_POSTAL_CODE + " TEXT," +
"UNIQUE("+KEY_ADDRESS_COUNTRY+","+KEY_ADDRESS_CITY+","+KEY_ADDRESS_STREET+","+KEY_ADDRESS_HOUSE+","+KEY_ADDRESS_POSTAL_CODE +") ON CONFLICT IGNORE)"
添加重复记录时,insert()metod返回-1,而不是现有行的ID。
这个问题只能在4.0+上重现。该方法如2.2和2.3.3所述。
有人面临同样的问题吗?
最佳答案
不幸的是,Android文档是错误的。(因此,您的代码在Android的早期版本(如2.2和2.3)上实际上并不像预期的那样工作。)
在2.2和2.3中,insertWithOnConflict()
将返回sqlite c api函数sqlite3_last_insert_rowid()的值,其文档清楚地说明失败的插入(例如,在应用冲突解决(如忽略)时)不会影响返回值。因此,如果没有为连接执行先前的插入,并且尝试重复插入,insertWithOnConflict()
将返回0。如果前面的insert向任何表中添加了一行,那么该方法将返回该insert的行ID——当然,这是非常不正确的。
在4.0中,insertWithOnConflict()
将返回相同sqlite c api函数的值,但返回-1而不是0除外。
这一变化就是您现在观察错误的原因。但是如果您仔细检查2.2和2.3中的结果,您会发现当执行OR IGNORE
子句时返回的行ID实际上不是正确的行ID(除了巧合)。