2011-09-19 15 views
6

Ho bisogno di memorizzare un record utilizzando il metodo rawQuery, perché voglio inserire la data e l'ora correnti (datetime()), ma devo anche inserire stringhe che contengono virgolette.Come utilizzare rawQuery per inserire un record

Così ho scritto questo codice:

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

Ma non memorizza nulla ... cosa c'è di sbagliato?

[EDIT]

In questo modo non ottengo errori, ma non è inserito il record.

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

In questo momento, l'unico metodo che funziona per inserire un record (con il problema virgolette) è execSQL(String s).

risposta

15

SQLite non ha un tipo di archiviazione dati datetime nativo. Può invece memorizzare una stringa o una rappresentazione intera di una data.

per convertire i vostri valori è possibile utilizzare le funzioni di tempo data descritti in Sqlite Date and Time functions documentation

Il vostro primo tentativo è quasi corretta, ma il vostro datetime() chiamata di funzione richiede un argomento di 'NOW'.

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

Inoltre si dovrebbe chiamare execSQL invece di rawQuery che si aspettava di restituire un set di record.

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

È alo possibile specificare le singole colonne per inserire dati in inserendo un elenco campo dopo il nome della tabella nella query, se non l'inserimento di tutti i valori

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

Un'altra opzione che potrebbe essere possibile è using a default timestamp in SQLite , anche se non l'ho provato in Android.

+0

Ho modificato la domanda – supergiox

+0

È possibile che rawQuery non funzioni con INSERT? La documentazione non dice nulla al riguardo – supergiox

+0

Niente ... questo è il metodo che funziona (eccepito per le virgolette): 'String sql =" INSERT INTO sms VALUES (null, '"+ mitt +"', '"+ dest +" ',' "+ text +" ', datetime (' NOW ')) "; dbw.execSQL (sql); ' – supergiox

-2

Prova in questo modo:

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

Ma in questo modo non è possibile utilizzare datetime() – supergiox

+0

è possibile salvare datetime come valore lungo in sqlite db. Ottenendo cal.getTimeinMillis(); e può convertire il valore lungo in dataTime in java. –

+0

Vorrei usare datetime() di sqlite per evitare problemi di formato ... ma se questo è l'unico modo, come posso convertire getTimeinMillis() in datetime? – supergiox

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

Segna le virgolette singole.

+0

Ho fatto questo, ma il problema rimane ... – supergiox

+1

utilizzando stringhe dirette in una query SQL può rendere il codice soggetto a SQL Injection, non utilizzarlo – Anuj

3

ho risolto il problema con in questo modo:

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

Finalmente posso memorizzare ogni char senza problemi !!!

+0

sfortunatamente non avevo visto la tua risposta quando l'ho trovata ... Comunque ti meriti l'accettazione! – supergiox

+0

E il manuale che dice per execSQL: Esegui una singola istruzione SQL che NON è SELECT/INSERT/UPDATE/DELETE – Enriqe

Problemi correlati