SQLiteDatabase.query yöntemi


121

SQLiteDatabase sorgu yöntemini kullanıyorum. Sorgu yöntemini nasıl kullanırım?

Bunu denedim:

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

tableColumns - column parametresi aşağıdaki gibi oluşturulmuştur.

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

Tüm alanları almamız gerekirse, sütun parametresi nasıl inşa edilmelidir? String dizisine tüm Alan Adlarını dahil etmemiz gerekiyor mu?

Sorgu yöntemini nasıl düzgün kullanırım?


1
Gibi basit bir yaklaşım deneyin bu
İmran Rana

Bu yöntemi biliyorum. Ancak rawQuery yerine sorgu yönteminin nasıl uygulanacağını öğrenmeye çalışıyorum.
sree_iphonedev

Yanıtlar:


244

tableColumns

  • null olduğu gibi tüm sütunlar için SELECT * FROM ...
  • new String[] { "column1", "column2", ... }olduğu gibi belirli sütunlar için SELECT column1, column2 FROM ...- buraya karmaşık ifadeler de koyabilirsiniz:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }size maxmaksimum değerini tutan adlı bir sütun verircolumn1

whereClause

  • WHEREo anahtar kelime olmadan koyduğunuz kısım , örneğin"column1 > 5"
  • ?dinamik olan şeyleri içermelidir , örneğin "column1=?"-> bakınwhereArgs

whereArgs

  • Her doldurur içeriği belirtmek ?üzere whereClausegöründükleri sırayla

diğerleri

  • tıpkı whereClauseanahtar kelimeden sonraki ifade gibi veya nullkullanmıyorsanız.

Misal

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");

aşağıdaki ham sorguya eşdeğerdir

String queryString =
    "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
    "WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);

Where / Bind -Args versiyonunu kullanarak otomatik olarak kaçan değerler alırsınız ve input-data içeriyorsa endişelenmenize gerek kalmaz '.

Güvensiz: String whereClause = "column1='" + value + "'";
Güvenli:String whereClause = "column1=?";

çünkü değer bir ifadeniz içeriyorsa 'ya kesilir ve istisnalar alırsanız ya da istenmeyen şeyler yaparsanız, örneğin value = "XYZ'; DROP TABLE table1;--"tablonuzu bırakabilir, çünkü ifade iki ifade ve yorum haline gelir:

SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'

args sürümünü kullanıyor XYZ'; DROP TABLE table1;--kaçan olacağını 'XYZ''; DROP TABLE table1;--'ve sadece bir değer olarak ele alınır. 'Kötü şeyler yapma niyetinde olmasa bile , insanların adlarında bunu bulundurmaları veya metinlerde, dosya adlarında, şifrelerde vb. Kullanmaları oldukça yaygındır. Bu nedenle her zaman args sürümünü kullanın. ( intVe diğer ilkelleri doğrudan içine inşa etmek sorun değil whereClause)


Limit / ofset bu ... grubuna göre nereye giriyor? sahip? tarafından sipariş?
Lion789

3
@ Lion789 bir limitparametreye sahip birkaç sürüm vardır , örneğin developer.android.com/reference/android/database/sqlite/… hepsi sonunda basit bir metin birleştirme, böylece örneğin "some_column LIMIT 10"içine koyabilirsiniz orderByve yine de çalışır
zapl

Burada 2 masayı birleştirme seçeneğiniz var mı?
Vijay Kumbhoje

2
@VijayKumbhoje, örneğin table1 CROSS JOIN table2tablename olarak koyabilmelisiniz . Ancak rawquery'ye bakmam gereken bir nokta var: stackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhoje ne ile daha rahat hissediyorsan / sonunda daha temiz görünüyor. queryYöntemler sadece gibi birkaç anahtar kelime ekliyorsunuz SELECTve FROMargümanları (kaynağını bakınız) daha sonra yapmak rawQuerysonuçlanan sorgu dizesi ile. Sorgunuz kullanılabilir argümanlarına tam olarak uymuyorsa query, sorgu dizesini kendiniz yazmanız yeterlidir.
zapl

21

Bu, gelecekteki izleyiciler için hızlı bir referans olması gereken daha genel bir cevaptır.

Misal

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);

Belgelerden açıklama

  • table Dize: Sorguyu karşı derlenecek tablo adı.
  • columns Dize: Döndürülecek sütunların listesi. Null değerinin aktarılması tüm sütunları döndürür; bu, kullanılmayacak olan verilerin depodan okunmasını önlemek için önerilmez.
  • selection Dize: Hangi satırların döndürüleceğini bildiren, bir SQL WHERE yan tümcesi olarak biçimlendirilmiş (WHERE'nin kendisi hariç) bir filtre. Null değerini geçmek, verilen tablo için tüm satırları döndürür.
  • selectionArgs Dize: Seçimde görünmeleri için, seçimArgs'deki değerlerle değiştirilecek? Leri seçime dahil edebilirsiniz. Değerler Dizeler olarak bağlanacaktır.
  • groupBy Dize: Satırların nasıl gruplandırılacağını bildiren, SQL GROUP BY deyimi olarak biçimlendirilmiş (GROUP BY'ın kendisi hariç) bir filtre. Null değerini geçmek satırların gruplanmamasına neden olur.
  • having Dize: Bir filtre, satır gruplaması kullanılıyorsa, bir SQL HAVING yan tümcesi olarak biçimlendirilmiş (HAVING'in kendisi hariç) imlece hangi satır gruplarının dahil edileceğini bildirir. Null değerini geçmek, tüm satır gruplarının dahil edilmesine neden olur ve bu, satır gruplaması kullanılmadığında gereklidir.
  • orderBy Dize: SQL ORDER BY deyimi olarak biçimlendirilmiş satırların nasıl sıralanacağı (ORDER BY'ın kendisi hariç). Boş değer geçmek, sıralanmamış olabilen varsayılan sıralama düzenini kullanır.
  • limit Dize: Sorgu tarafından döndürülen satırların sayısını LIMIT yan tümcesi olarak biçimlendirilmiş olarak sınırlar. Boş değer geçmek LIMIT yan tümcesi olmadığını gösterir.

16

Burada yan tümce ve bağımsız değişkenler, SQL sorgusunun WHERE ifadesini oluşturmak için birlikte çalışır. Öyleyse ifade etmek istediğini söyle

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

Sonra whereClause ve whereArgs aşağıdaki gibi olacak

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

Tüm tablo sütunlarını seçmek istiyorsanız, tableColumns'a iletilen boş bir dizgenin yeterli olacağına inanıyorum.


içine yoktur ?yılında ', 'gerekirse otomatik olarak eklenir
zapl

1

SQL sorgunuz böyle ise

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;

Daha sonra query () yöntemi için şunları yapabiliriz: -

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);

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 + "=" + rowIDBurada =ise wheretümcesi. Tüm değerleri seçmek için tüm sütun adlarını vermeniz gerekir:

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

ve işte veritabanı için iyi bir öğretici .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.