ver una tutorial studio room para hacer español descargar datos consultas conexion como android sqlite

una - sqlite android tutorial español



¿Por qué un delete rawQuery necesita un moveToFirst para eliminar realmente las filas? (4)

He estado luchando durante horas intentando depurar por qué la siguiente consulta de eliminación no eliminó nada, incluso si la misma consulta exactamente en la misma base de datos funcionó bien en el Administrador de SQLite de Firefox:

String deleteSql = "DELETE FROM showsummary WHERE url IN (SELECT url FROM showsummary JOIN article_categories USING (url) WHERE categoryid=20 AND title LIKE ''page=%'')"; mDb.rawQuery(deleteSql, null);

Dado que es un poco complicado con un JOIN y una subconsulta, mis pensamientos giraron en torno a algunas limitaciones en la implementación de sqlite de Android con respecto a sub consultas, así que traté de simplificar la consulta. Pero aún así no eliminó nada.

Luego lo cambié a una consulta de selección (acaba de reemplazar DELETE con SELECT *) y funcionó. Entonces, probablemente no fue la unión o la sub consulta la culpable después de todo.

Para probar la consulta de selección, agregué un moveToFirst() al cursor devuelto:

mDb.rawQuery(deleteSql, null).moveToFirst();

Cuando más tarde lo cambié de nuevo a una consulta de eliminación, olvidé eliminar el moveToFirst() y luego funcionó.

Es bueno que funcione ahora, pero estoy muy confundido sobre por qué es necesario mover el cursor para eliminar algo. ¿Es esto por diseño o es un error?



En mi caso también, lo mismo ha sucedido con DELETE, se ejecutó con éxito después de llamar a "cursor.moveToFirst ()". Igual es el caso con las consultas INSERT y UPDATE también. También he observado que llamando a cualquier método en el cursor para las consultas mencionadas anteriormente, obtuve los resultados correctamente. Sin llamar a ningún método del cursor, se produce el efecto deseado. Entonces, creo que la respuesta a su pregunta es: Query se ejecuta solo cuando llamamos a algún método en el cursor.


La respuesta es porque RawQuery en realidad no se ejecuta hasta que se llame a algún método en el cursor devuelto. moveToFirst, isAfterLast ..


No puedo responder el por qué, pero otra solución es usar .execSQL (String) como se publicó aquí.