tableColumns
null
cho tất cả các cột như trong SELECT * FROM ...
new String[] { "column1", "column2", ... }
cho các cột cụ thể như trong SELECT column1, column2 FROM ...
- bạn cũng có thể đặt các biểu thức phức tạp ở đây:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
sẽ cung cấp cho bạn một cột có tên max
chứa giá trị tối đa củacolumn1
ở đâu
- phần bạn đặt sau
WHERE
mà không có từ khóa đó, ví dụ:"column1 > 5"
- nên bao gồm
?
những thứ động, ví dụ "column1=?"
-> xemwhereArgs
whereArgs
- chỉ định nội dung điền
?
vào từng whereClause
thứ theo thứ tự chúng xuất hiện
những người khác
- giống như
whereClause
câu lệnh sau từ khóa hoặc null
nếu bạn không sử dụng nó.
Thí dụ
String[] tableColumns = new String[] {
"column1",
"(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
"value1",
"value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
null, null, orderBy);
// since we have a named column we can do
int idx = c.getColumnIndex("max");
tương đương với truy vấn thô sau đây
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Bằng cách sử dụng phiên bản Where / Bind -Args, bạn sẽ nhận được các giá trị tự động thoát và bạn không phải lo lắng nếu dữ liệu đầu vào có chứa '
.
Không an toàn: String whereClause = "column1='" + value + "'";
An toàn:String whereClause = "column1=?";
bởi vì nếu giá trị chứa một '
câu lệnh của bạn hoặc là ngắt và bạn nhận được ngoại lệ hoặc thực hiện những điều không mong muốn, ví dụ: value = "XYZ'; DROP TABLE table1;--"
thậm chí có thể làm rớt bảng của bạn vì câu lệnh sẽ trở thành hai câu lệnh và một nhận xét:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
sử dụng phiên bản args XYZ'; DROP TABLE table1;--
sẽ được thoát đến 'XYZ''; DROP TABLE table1;--'
và sẽ chỉ được coi là một giá trị. Ngay cả khi '
nó không nhằm mục đích làm điều xấu, vẫn khá phổ biến là mọi người có nó trong tên của họ hoặc sử dụng nó trong văn bản, tên tệp, mật khẩu, v.v. Vì vậy, hãy luôn sử dụng phiên bản args. (Tuy nhiên, có thể xây dựng int
và các nguyên thủy khác trực tiếp vào whereClause
)