2011-07-07 16 views
14

¿Cómo resuelve la biblioteca de SQLite de Android conflictos si inserto filas duplicadas? Estoy construyendo mi aplicación para el nivel de API 7, que por desgracia no tiene el método SQLiteDatabase.insertOnConflict() que se incluyó a partir del nivel de API 8.Resolución de conflictos en SQLiteDatabase de Android

Respuesta

30

puede especificar un índice de UNIQUE en la definición de tabla que permiten que las filas sean REPLACE D:

CREATE TABLE mytable (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT NOT NULL, 
    UNIQUE (id) ON CONFLICT REPLACE 
) 

Si una fila un INSERT o UPDATE intenta añadir una fila con un ID que ya existe, la fila existente se sustituye por uno nuevo.

+1

+1 Potencialmente peligroso, pero también útil función No he oído hablar de befor. – piotrpo

+3

De hecho, debe tener cuidado y asegurarse de que sea el resultado deseado en todos los casos. Funciona muy bien para cosas como la sincronización de una base de datos local con datos remotos. –

+0

Gracias. Esto funcionará por ahora. Pero, según tengo entendido, si creo una tabla con esta declaración, se reemplazará cada vez que haya un conflicto. Pero, ¿qué ocurre si no quiero utilizar este tipo de resolución de conflictos cada vez que hago una inserción? – kibibyte

0

De manera predeterminada, si tiene una excepción de índice única, se lanzará una inserción de índice duplicado. solución común es comprobar la existencia registro antes de ejecutar inserción - pseudo-código:

select * from people where name = 'Smith'; 
//if resultset is empty then perform insert 
insert into people values 'Smith' 
6

Hay una cláusula en ON CONFLICT SQLite que se puede decir INSERT INTO ... ON CONFLICT....

Lea la documentación por favor. http://www.sqlite.org/lang_conflict.html

+0

De hecho, utilice esto si no siempre quiere reemplazar en conflicto. –

+0

¿Funciona esto en varias instrucciones de inserción? – kaz

Cuestiones relacionadas