2009-08-18 47 views
41

Tôi muốn thực hiện một truy vấn như sau:dấu ngoặc kép Android trong một chuỗi truy vấn sql

uvalue = EditText(some user value); 
p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 
mDb.rawQuery(p_query, null); 

nếu người dùng nhập vào một giá duy nhất trong đầu vào của họ nó bị treo. Nếu bạn thay đổi nó thành:

p_query = "select * from mytable where name_field = \"" + uvalue + "\"" ; 

nó sẽ treo nếu người dùng nhập dấu ngoặc kép vào đầu vào của họ. và tất nhiên họ luôn có thể nhập cả dấu nháy kép và đơn.

+0

miannelle, hãy kiểm tra những câu hỏi liên quan sau: http://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql http://stackoverflow.co m/question/387198/escape-double-quotes-in-sql-2005-2008 –

+3

miannelle: Bạn nên xem xét việc đánh dấu một số câu hỏi của mình là "đã trả lời" – Kurru

Trả lời

125

Bạn nên tận dụng tham số selectionArgs các rawQuery phương pháp của:

p_query = "select * from mytable where name_field = ?"; 
mDb.rawQuery(p_query, new String[] { uvalue }); 

Điều này không chỉ giải quyết vấn đề trích dẫn của bạn mà còn giúp giảm bớt SQL Injection.

+5

Tôi ước tôi có thể nâng cấp điều này nhiều lần! – jrockway

+1

Nó cũng nhanh hơn nhiều vì Sqlite không phải phân tích cú pháp mỗi câu lệnh sql. – tuinstoel

+20

Thật vậy, bạn nên sử dụng các đối số truy vấn. Tuy nhiên, bạn cũng có thể sử dụng DatabaseUtils để thoát khỏi chuỗi, nếu cần. Ví dụ, DatabaseUtils.sqlEscapeString(). Nó không phải là cách tốt nhất, nhưng nó có sẵn. Có thể hữu ích nếu bạn đang cố chuyển một câu lệnh SQL thô sang một thứ gì đó bên ngoài. – lilbyrdie

14

Cơ sở dữ liệuUtils.sqlEscapeString hoạt động bình thường cho tôi. Chuỗi được bao quanh bởi dấu nháy đơn và dấu nháy đơn bên trong chuỗi trở thành dấu ngoặc kép. Đã thử sử dụng selectionArgs trong truy vấn getContentResolver().() Nhưng nó không hoạt động chút nào.

2

Bạn đã thử thay thế một trích dẫn đơn với 2 dấu nháy đơn? Điều đó làm việc để nhập dữ liệu vào cơ sở dữ liệu.

+0

Tôi muốn sử dụng câu trả lời hàng đầu, nhưng trong trường hợp của tôi, nó không phải là có thể làm cho thiết kế ứng dụng.Điều này hoạt động quá – Patrick

1

Tôi có cùng một vấn đề nhưng bây giờ nó đã được giải quyết bằng cách chỉ cần viết code như trong trường hợp của bạn, bạn muốn chèn giá trị uvalue .Sau đó viết như

uvalue= EditText(some user value); 
uvalue = uvalue.replaceAll("'", "''"); 
p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 
mDb.rawQuery(p_query, null); 

mát .. !!

+1

đó là ngu ngốc, bạn đang thay thế 'với' 'mà vẫn sẽ gây ra vấn đề. – stealthcopter

+0

Có lẽ ngu ngốc, nhưng làm việc tốt cho tôi. Cảm ơn –

+0

@stealthcopter Đó không phải là ngu ngốc, cách SQL tiêu chuẩn để thoát khỏi một dấu nháy đơn trong một chuỗi chữ là tăng gấp đôi nó để ''' ''' là một chuỗi ký tự SQL có chứa một dấu nháy đơn. Các chuỗi thoát theo cách thủ công cho SQL có thể không phải là ý tưởng tốt nhất nhưng kết quả là đúng trong trường hợp này. –

1

tôi thích để thoát khỏi Dấu nháy đơn và dấu ngoặc kép trong mỗi câu lệnh insert với Sqlite như thế này:

String sqlite_stament = sqlite_stament.replace("'", "''").replace("\"", "\"\""); 
2

Bạn nên thay đổi

p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 

như

p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ; 
+0

Giải pháp tuyệt vời và rõ ràng –

+0

nhưng nhu cầu của bạn xóa dấu ngoặc kép vì chúng được thêm theo mặc định –

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