2012-01-12 31 views
25

Tôi đang phát triển một ứng dụng cơ sở dữ liệu Android. Tôi chỉ muốn biết mã nào thực thi nhanh hơn và sự khác biệt giữa chúng là gì?Android SQLite: Truy vấn nào ("truy vấn" hoặc "rawQuery") nhanh hơn?

Query - 1 =

db.rawQuery("select * from user_table where user_id =" + userId, null); 

Query - 2 =

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = " + userId, null, null, null, null); 
+0

... thử và xem? Tôi sẽ đoán "giống nhau" cho mọi mục đích và mục đích. Tuy nhiên, * vui lòng sử dụng trình giữ chỗ trong cả hai trường hợp *. –

+0

Nếu bạn có một hệ thống xây dựng đã được thiết lập, hãy thực hiện một số điểm chuẩn trên đó. Ngoài ra, bạn đang mong đợi loại công việc nào và bạn đang tìm kiếm lợi nhuận nào? –

Trả lời

15

Sử dụng truy vấn.

Truy vấn biên dịch trước của Android và sử dụng quá nhiều truy vấn thô khác nhau có thể gây ra vấn đề về hiệu suất.

Chỉ sử dụng rawQuery khi thật cần thiết.

Ngoài ra, cả hai ví dụ của bạn đều có vấn đề bảo mật nghiêm trọng về SQL Injection.

Bạn nên khử trùng userId.

Điều rõ ràng nhất để làm là để cho Android làm điều đó bằng cách sử dụng:

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = ?", new String[] {userId}, null, null, null); 
+3

RE truy vấn được biên dịch trước: Các truy vấn chỉ áp dụng khi sử dụng PreparedStatement. Query() chỉ xây dựng chuỗi và chuyển nó tới rawQuery(). –

+0

Vâng, PreparedStatement có nghĩa là để chạy cùng một truy vấn nhiều lần, đúng, nhưng tôi nghĩ rằng một số loại tối ưu hóa cũng được thực hiện bởi người lái xe. Tôi đã gặp phải một số lỗi khi sử dụng nhiều truy vấn khác nhau của android phàn nàn quá nhiều tuyên bố đã được cung cấp. :) –

+0

@JonAdams Hãy giúp tôi hiểu nhận xét của bạn, 'chỉ áp dụng khi sử dụng chuẩn bị', chúng tôi sử dụng chuẩn bị ở đâu trong khi cùng có thể đạt được bằng rawQuery? (tức là bạn có thể đặt '?', và vượt qua đối số?) – Darpan

5

Nhìn vào SQLiteDatabase.java trong nguồn android cho thấy rằng các truy vấn (..) kết thúc lên gọi QueryBuilder để xây dựng truy vấn dưới dạng một chuỗi đơn và sau đó về cơ bản nó gọi là rawQuery(). Chúng nên tương đương nhau, giả sử rằng bạn cũng đã làm cùng một công việc để xây dựng câu lệnh của riêng bạn.

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