2011-09-19 37 views
6

Tôi cần lưu trữ bản ghi bằng cách sử dụng phương pháp rawQuery, bởi vì tôi muốn chèn ngày và giờ hiện tại (datetime()), nhưng tôi cũng cần phải chèn các chuỗi có chứa dấu ngoặc kép.Cách sử dụng rawQuery để chèn một bản ghi

Vì vậy, tôi đã viết mã này:

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

Nhưng nó không lưu trữ bất cứ điều gì ... chuyện gì vậy?

[EDIT]

Bằng cách này, tôi không nhận lỗi, nhưng kỷ lục không được chèn vào.

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

Tại thời điểm này, phương pháp duy nhất hoạt động để chèn một kỷ lục (với dấu ngoặc kép vấn đề) là execSQL(String s).

Trả lời

15

SQLite không có kiểu lưu trữ dữ liệu datetime gốc. Nó có thể lưu trữ một chuỗi hoặc một biểu diễn số nguyên của một ngày thay thế.

Để chuyển đổi các giá trị của bạn, bạn có thể sử dụng các chức năng thời gian ngày chi tiết trong Sqlite Date and Time functions documentation

nỗ lực ban đầu của bạn là gần như chính xác, nhưng datetime của bạn() chức năng cuộc gọi đòi hỏi một cuộc tranh cãi của 'NOW'.

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

Ngoài ra bạn nên gọi execSQL thay vì rawQuery được mong đợi để trả về một recordset.

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

Bạn alo có thể chỉ định các cột riêng biệt để chèn dữ liệu vào bằng cách chèn một danh sách lĩnh vực sau tên bảng trong truy vấn của bạn nếu không chèn tất cả các giá trị

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

Một tùy chọn khác mà bạn có thể có thể là using a default timestamp in SQLite , mặc dù tôi đã không cố gắng này trong android.

+0

Tôi đã chỉnh sửa câu hỏi – supergiox

+0

Có thể rawQuery không hoạt động với INSERT không? Các tài liệu không nói bất cứ điều gì về nó – supergiox

+0

Không có gì ... đây là phương pháp hoạt động (đánh dấu cho dấu ngoặc kép): 'String sql =" INSERT INTO sms VALUES (null, '"+ mitt +"', '"+ dest +" ',' "+ text +" ', datetime (' NOW ')) "; dbw.execSQL (sql); ' – supergiox

-2

Hãy thử nó như thế này:

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

Nhưng bằng cách này tôi không thể sử dụng datetime() – supergiox

+0

bạn có thể lưu datetime như giá trị dài trong sqlite db. Bằng cách lấy cal.getTimeinMillis(); và có thể chuyển đổi giá trị dài thành dataTime trong java. –

+0

Tôi muốn sử dụng datetime() của sqlite để tránh các vấn đề định dạng ... nhưng nếu đây là cách duy nhất, làm thế nào tôi có thể chuyển đổi getTimeinMillis() thành datetime? – supergiox

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

Đánh dấu ngoặc kép duy nhất.

+0

Tôi đã làm điều này, nhưng vấn đề vẫn còn ... – supergiox

+1

sử dụng chuỗi trực tiếp trong truy vấn SQL có thể làm cho mã của bạn dễ bị SQL Injection, không sử dụng nó – Anuj

3

tôi giải quyết vấn đề với theo cách này:

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

Cuối cùng tôi có thể lưu trữ tất cả các char không có vấn đề !!!

+0

tiếc là tôi đã không nhìn thấy câu trả lời của bạn khi tôi tìm thấy nó ... Dù sao bạn xứng đáng được chấp nhận! – supergiox

+0

Và những gì về hướng dẫn mà nói cho execSQL: Thực hiện một câu lệnh SQL đơn mà không phải là một SELECT/INSERT/UPDATE/DELETE – Enriqe

Các vấn đề liên quan