我有一个简单的地址表,其中包含以下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)"
Run Code Online (Sandbox Code Playgroud)
当我添加重复记录时,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()的值,其文档清楚地指出失败的插入(例如,应用ON CONFLICT解析,如IGNORE)不会影响返回值.因此,如果进行了连接之前没有插入和重复插入尝试,insertWithOnConflict()将返回0.如果现有的插入件添加一行到任何表,该方法将返回的行ID 是插入---当然这是非常不正确.
在4.0中,insertWithOnConflict()将返回相同SQLite C API函数的值,除了返回-1而不是0.
此更改是您现在正在观察错误的原因.但是如果你在2.2和2.3中仔细检查结果,你会发现在执行该OR IGNORE子句时返回的行id 实际上并不是正确的行ID(巧合除外).
| 归档时间: |
|
| 查看次数: |
3767 次 |
| 最近记录: |