tableColumns
null untuk semua kolom seperti pada SELECT * FROM ...
new String[] { "column1", "column2", ... }untuk kolom tertentu seperti di SELECT column1, column2 FROM ...- Anda juga dapat meletakkan ekspresi kompleks di sini:
new String[] { "(SELECT max(column1) FROM table1) AS max" }akan memberi Anda kolom bernama maxmemegang nilai makscolumn1
whereClause
- bagian yang Anda masukkan
WHEREtanpa kata kunci itu, mis"column1 > 5"
- sebaiknya menyertakan
?untuk hal-hal yang bersifat dinamis, mis "column1=?"-> lihatwhereArgs
whereArgs
- tentukan konten yang mengisi masing-masing
?dalam whereClauseurutan kemunculannya
yang lain
- seperti
whereClausepernyataan setelah kata kunci atau nulljika Anda tidak menggunakannya.
Contoh
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");
setara dengan kueri mentah berikut
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Dengan menggunakan versi Where / Bind -Args Anda mendapatkan nilai-nilai yang di-escape secara otomatis dan Anda tidak perlu khawatir jika data input berisi '.
Tidak String whereClause = "column1='" + value + "'";
Aman: Aman:String whereClause = "column1=?";
karena jika nilai berisi 'pernyataan Anda akan rusak dan Anda mendapatkan pengecualian atau melakukan hal-hal yang tidak diinginkan, misalnya value = "XYZ'; DROP TABLE table1;--"bahkan mungkin menjatuhkan tabel Anda karena pernyataan tersebut akan menjadi dua pernyataan dan komentar:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
menggunakan versi args XYZ'; DROP TABLE table1;--akan di-escape ke 'XYZ''; DROP TABLE table1;--'dan hanya akan diperlakukan sebagai nilai. Sekalipun 'tidak dimaksudkan untuk melakukan hal-hal buruk, masih cukup umum bahwa orang-orang memilikinya dalam nama mereka atau menggunakannya dalam teks, nama file, sandi, dll. Jadi selalu gunakan versi args. (Tidak apa-apa untuk membangun intdan primitif lainnya secara langsung whereClause)