2011-11-02 10 views
30

Necesito hacer un tipo de procedimiento INSERT o UPDATE IF EXIST con mi base de datos. Leí que .replace() era el camino a seguir. Inserta nuevos registros muy bien, pero si el registro ya existe, no parece actualizarlo.Android SQLite: ¿qué hace realmente SQLiteDatabase.replace()?

que tienen algo como esto:

ContentValues values = new ContentValues(); 
values.put(ID, 1); 
values.put(NAME, "bob"); 
values.put(VISIBLE, true); 
db.replace("peopleTable", null, values); 

Si me quedo este código cuando este registro no está en la base de datos, aparece para crear el registro bien, como si lo hiciera un insert(). Pero si cambio NAME a "john" o algo así, y ejecuto el replace() nuevamente, no parece actualizar el registro.

De acuerdo con los documentos, aquí se muestra la sintaxis:

public long replace (String table, String nullColumnHack, ContentValues initialValues) 

Por qué se llama initalValues? ¿Significa eso que esos valores solo se usan cuando el registro no existe y se va a insertar? Si es así, ¿cómo usas el método para actualizar un registro? ¿Dónde especificas los nuevos valores?

Si no entiendo bien lo que replace() hace en conjunto, ¿alguien puede explicar cuál es su propósito?

+1

Lo hace insertar o sustituir. –

+2

Puede utilizar los procedimientos 'INSERT' y' REPLACE' en sus métodos 'ContentProvider.insert()' si pasa un parámetro especial en su 'ContentValues'. Escribí una publicación de blog sobre esto aquí: [SQLite INSERT O REPLACE through ContentProvider | Zumbido de Android] (http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

Respuesta

29

Según entiendo, replace() funciona de forma muy parecida a la palabra clave SQLite REPLACE: una fila se actualizará si se produce una violación de restricción única para la inserción. Por lo tanto, la columna ID en su ejemplo necesitaría tener una restricción PRIMARY KEY en el esquema de la base de datos para la fila que se actualizará.

+0

Creo que ese podría ser el problema. –

+0

Antes que nada, sí, el campo "_id" es la CLAVE PRIMARIA. En segundo lugar, no se están creando nuevos registros. Esto significa que el método es, de hecho, encontrar el registro original y no hacer uno nuevo. Pero como dije, el registro existente simplemente no se está actualizando ... –

+2

Sí, para citar la publicación de blog de @JesperB: "Como puede ver en la documentación oficial (SQL Entendido por SQLite), el comando hace un INSERTO O REEMPLAZAR. Es decir, hacer un INSERTO, y si ese INSERT falla debido a un conflicto, elimine las filas en conflicto antes de INSERTAR de nuevo. " –

3

El método replace() realmente ejecutan el comando sql insert or replace into (...) values (...)

Cuestiones relacionadas