2011-09-19 10 views
6

Necesito almacenar un registro usando el método rawQuery, porque quiero insertar la fecha y hora actual (datetime()), pero también necesito insertar cadenas que contengan comillas.Cómo usar rawQuery para insertar un registro

así que escribí este código:

String sql="INSERT INTO sms VALUES (null, ?1, ?2, ?3, datetime())"; 
dbw.rawQuery(sql, new String[]{str1,str2,str3}); 

Pero no almacena nada ... ¿qué pasa?

[EDIT]

De esta manera no se producen errores, pero no se inserta el disco.

String mitt="mitt", dest="dest", text="text"; 
String sql="INSERT INTO sms VALUES (null, ?, ?, ?, datetime('NOW'))"; 
dbw.rawQuery(sql, new String[]{mitt,dest,text}); 

En este momento, el único método que funciona para insertar un registro (con un problema comillas) es execSQL(String s).

Respuesta

15

SQLite no tiene un tipo de almacenamiento de datos de fecha y hora nativo. En su lugar, puede almacenar una cadena o una representación entera de una fecha.

para convertir sus valores se pueden utilizar las funciones de fecha y hora que se detallan en Sqlite Date and Time functions documentation

Su intento inicial es casi correcta, pero su fecha y hora() llamada a la función requiere un argumento de 'NOW'.

String sql="INSERT INTO sms VALUES (null, ?, ?, ?, datetime('NOW'))"; 

También debe llamar en lugar de execSQLrawQuery que está esperando para devolver un conjunto de registros.

dbw.execSQL(sql, new String[]{str1,str2,str3}); 

Puede especificar alo columnas individuales para insertar datos en insertando una lista de campos después del nombre de la tabla de la consulta si no es la inserción de todos los valores

String sql = "INSERT INTO sms(f1, f2, f3, f4)" 
      + "VALUES (null, ?, ?, ?, datetime('NOW'))"; 

Otra opción que puede ser posible es using a default timestamp in SQLite , aunque no he intentado esto en Android.

+0

Edité la pregunta – supergiox

+0

¿Es posible que rawQuery no funcione con INSERT? La documentación no dice nada al respecto – supergiox

+0

Nada ... este es el método que funciona (excepto por las comillas): 'String sql =" INSERT INTO sms VALUES (null, '"+ mitt +"', '"+ dest +" ',' "+ texto +" ', fecha y hora (' AHORA ')) "; dbw.execSQL (sql); ' – supergiox

-2

Trate de esta manera:

ContentValues values; 
values=new ContentValues(); 

// values.put("field_name",value); 
values.put("id", 5); 
values.put("name", name); 
dbw.insert("table_name", null, values); 
+0

Pero de esta manera no puedo usar datetime() – supergiox

+0

puede guardar datetime como valor largo en sqlite db. Al obtener cal.getTimeinMillis(); y puede convertir valor largo en dataTime en java. –

+0

Me gustaría usar datetime() de sqlite para evitar problemas de formato ... pero si esta es la única forma, ¿cómo puedo convertir getTimeinMillis() en datetime? – supergiox

-2
String sql="INSERT INTO sms VALUES (null, '"+str1+"', '"+str2+"', '"+str3+"', datetime())"; 
dbw.rawQuery(sql, null); 

Marcar las comillas simples.

+0

He hecho esto, pero el problema persiste ... – supergiox

+1

usando cadenas directas en una consulta SQL puede hacer que su código sea propenso a la inyección SQL, no lo use – Anuj

3

me resolvió el problema de esta manera:

String sql="INSERT INTO sms VALUES (null,?,?,?,datetime('NOW'))"; 
dbw.execSQL(sql,new Object[]{mitt,dest,text}); 

fin puedo almacenar cada carbón sin problemas !!!

+0

lamentablemente no había visto su respuesta cuando la encontré ... De todos modos, usted merece la aceptación! – supergiox

+0

Y ¿qué pasa con el manual que dice para execSQL: Ejecutar una sola instrucción SQL que NO sea SELECCIONAR/INSERTAR/ACTUALIZAR/ELIMINAR – Enriqe

Cuestiones relacionadas