SQLiteDatabase.query

121

Saya menggunakan metode kueri SQLiteDatabase. Bagaimana cara menggunakan metode kueri?

Saya mencoba ini:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns - parameter kolom dibuat sebagai berikut.

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

Jika kita perlu mendapatkan semua field, bagaimana seharusnya parameter kolom dibangun. Apakah kita perlu menyertakan semua Nama Bidang dalam larik String?

Bagaimana cara menggunakan metode kueri dengan benar?

sree_iphonedev
sumber
1
Cobalah pendekatan sederhana seperti ini
Imran Rana
Saya tahu metode itu. Tetapi saya mencoba mempelajari cara mengimplementasikan metode kueri alih-alih rawQuery.
sree_iphonedev

Jawaban:

244

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)

zapl
sumber
Di manakah Limit / offset termasuk dalam ini ... dikelompokkan berdasarkan? memiliki? dipesan oleh?
Lion789
3
@ Lion789 ada beberapa versi yang memiliki limitparameter, misal developer.android.com/reference/android/database/sqlite/… pada akhirnya semua hanya penggabungan teks sederhana sehingga Anda dapat memasukkan misalnya "some_column LIMIT 10"ke dalam orderBydan itu akan tetap berfungsi
zapl
Adakah opsi di sini untuk menggabungkan 2 tabel?
Vijay Kumbhoje
2
@VijayKumbhoje Anda harus dapat menempatkan misalnya table1 CROSS JOIN table2sebagai tablename. Tetapi ada titik di mana saya akan melihat rawquery: stackoverflow.com/q/10598137/995891
zapl
3
@VijayKumbhoje apa pun yang Anda rasa lebih nyaman / terlihat lebih bersih pada akhirnya. The querymetode hanya menambahkan beberapa kata kunci seperti SELECTdan FROMdengan argumen (lihat sumber) kemudian melakukan rawQuerydengan query string yang dihasilkan. Jika kueri Anda tidak cocok dengan argumen yang tersedia query, cukup tulis sendiri string kueri tersebut.
zapl
21

Ini adalah jawaban yang lebih umum yang dimaksudkan untuk menjadi referensi cepat bagi pemirsa di masa mendatang.

Contoh

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

Penjelasan dari dokumentasi

  • table String: Nama tabel untuk mengompilasi kueri.
  • columns String: Daftar kolom yang akan dikembalikan. Meneruskan null akan mengembalikan semua kolom, yang tidak disarankan untuk mencegah pembacaan data dari penyimpanan yang tidak akan digunakan.
  • selection String: Filter yang mendeklarasikan baris mana yang akan dikembalikan, diformat sebagai klausa SQL WHERE (tidak termasuk WHERE itu sendiri). Meneruskan null akan mengembalikan semua baris untuk tabel tertentu.
  • selectionArgs String: Anda dapat menyertakan? S dalam seleksi, yang akan digantikan oleh nilai-nilai dari selectionArgs, agar muncul dalam pemilihan. Nilai akan terikat sebagai String.
  • groupBy String: Filter yang menyatakan cara mengelompokkan baris, diformat sebagai klausa SQL GROUP BY (tidak termasuk GROUP BY itu sendiri). Meneruskan nol akan menyebabkan baris tidak dikelompokkan.
  • having String: Filter menyatakan grup baris mana yang akan disertakan dalam kursor, jika pengelompokan baris digunakan, diformat sebagai klausa SQL HAVING (tidak termasuk HAVING itu sendiri). Meneruskan null akan menyebabkan semua grup baris disertakan, dan diperlukan saat pengelompokan baris tidak digunakan.
  • orderBy String: Cara mengurutkan baris, diformat sebagai klausa SQL ORDER BY (tidak termasuk ORDER BY itu sendiri). Meneruskan null akan menggunakan urutan default, yang mungkin tidak berurutan.
  • limit String: Membatasi jumlah baris yang dikembalikan oleh kueri, dengan format klausa LIMIT. Meneruskan nol menunjukkan tidak ada klausa LIMIT.
Suragch
sumber
16

Di mana klausa dan args bekerja sama untuk membentuk pernyataan WHERE dari kueri SQL. Jadi katakanlah Anda ingin mengekspresikan

WHERE Column1 = 'value1' AND Column2 = 'value2'

Maka whereClause dan whereArgs Anda akan menjadi sebagai berikut

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

Jika Anda ingin memilih semua kolom tabel, saya yakin string null yang diteruskan ke tableColumns sudah cukup.

Ancantus
sumber
tidak menyertakan ?di ', yang' ditambahkan secara otomatis jika diperlukan
zapl
1

jika kueri SQL Anda seperti ini

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

Kemudian untuk metode query (), kita dapat melakukan seperti: -

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
Puneet Verma
sumber
0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowID, =ini whereklausulnya. Untuk memilih semua nilai, Anda harus memberikan semua nama kolom:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

dan berikut adalah tutorial yang bagus untuk database.

Avi Kumar Manku
sumber