在ICS中忽略Android sqlLite ON CONFLICT IGNORE

Zzo*_*okk 8 sqlite android

我有一个简单的地址表,其中包含以下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上按预期工作.

有没有人遇到同样的问题?

Dav*_* B. 9

不幸的是,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(巧合除外).