2011-09-19 20 views
6

Potrzebuję przechowywać rekord przy użyciu metody rawQuery, ponieważ chcę wstawić bieżącą datę i godzinę (datetime()), ale muszę również wstawić ciągi zawierające cytaty.Jak używać narzędzia rawQuery do wstawiania rekordu

Więc napisałem ten kod:

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

Ale to niczego nie przechowywać ... co się dzieje?

[EDIT]

W ten sposób nie pojawiają się błędy, ale płyta nie jest włożona.

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

W tej chwili to jedyna metoda, która działa do wstawienia rekordu (z cytatami problemu) jest execSQL(String s).

Odpowiedz

15

SQLite nie ma natywnego typu danych do przechowywania danych. Zamiast tego może przechowywać ciąg znaków lub całkowitą reprezentację daty.

Aby zamienić wartości można użyć funkcji czasu daty wyszczególnione w Sqlite Date and Time functions documentation

początkowej próbie jest prawie poprawne, ale Twój datetime() Wywołanie funkcji wymaga argumentu 'NOW'.

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

Również należy zadzwonić execSQL zamiast rawQuery która spodziewa się powrotu do rekordów.

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

Można alo określić poszczególne kolumny, aby wstawić dane do wkładając listę pól po nazwie tabeli w zapytaniu jeśli nie wkładając wszystkie wartości

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

Innym rozwiązaniem, które może być możliwe jest using a default timestamp in SQLite , chociaż nie próbowałem tego w Androidzie.

+0

Edytowałem pytanie – supergiox

+0

Czy to możliwe, że rawQuery nie działa z INSERT? Dokumentacja nic o tym nie mówi – supergiox

+0

Nic ... ta metoda działa (z wyjątkiem cytatów): 'String sql =" INSERT INTO sms VALUES (null, '"+ mitt +"', '+ dest + " "," "+ tekst +" ", datetime (" TERAZ "))"; dbw.execSQL (sql); ' – supergiox

-2

Spróbuj tak:

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

Ale w ten sposób nie można użyć datetime() – supergiox

+0

można zapisać datetime jako długiej wartości w sqlite db. Uzyskując cal.getTimeinMillis(); i może konwertować długą wartość na dataTime w java. –

+0

Chciałbym użyć datetime() z sqlite, aby uniknąć problemów z formatowaniem ... ale jeśli to jedyny sposób, w jaki sposób mogę przekonwertować getTimeinMillis() na datetime? – supergiox

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

oznaczyć apostrofów.

+0

Zrobiłem to, ale problem pozostaje ... – supergiox

+1

używanie bezpośrednich ciągów w zapytaniu SQL może spowodować, że kod będzie podatny na iniekcje SQL, nie używaj go – Anuj

3

I rozwiązać problem w ten sposób:

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

Wreszcie mogę przechowywać każdy char bez problemów !!!

+0

Niestety nie widziałem twojej odpowiedzi, kiedy ją znalazłem ... W każdym razie zasługujesz na akceptację! – supergiox

+0

A co z instrukcją, która mówi dla execSQL: Wykonywanie pojedynczego polecenia SQL, które NIE jest SELECT/INSERT/UPDATE/DELETE – Enriqe

Powiązane problemy