วิธี SQLiteDatabase.query


121

ฉันใช้วิธีการสืบค้นของ SQLiteDatabase ฉันจะใช้วิธีการสอบถามได้อย่างไร?

ฉันลองสิ่งนี้:

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

tableColumns - สร้างพารามิเตอร์ของคอลัมน์ดังนี้

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

หากเราต้องการรับฟิลด์ทั้งหมดควรสร้างพารามิเตอร์คอลัมน์อย่างไร เราจำเป็นต้องรวม Field Names ทั้งหมดใน String array หรือไม่?

ฉันจะใช้วิธีการสืบค้นได้อย่างไร?


1
ลองใช้วิธีง่ายๆเช่นนี้
Imran Rana

ฉันรู้วิธีนั้น แต่ฉันพยายามเรียนรู้วิธีใช้วิธีการสืบค้นแทน rawQuery
sree_iphonedev

คำตอบ:


244

tableColumns

  • null สำหรับคอลัมน์ทั้งหมดในรูปแบบ SELECT * FROM ...
  • new String[] { "column1", "column2", ... }สำหรับคอลัมน์เฉพาะเช่นในSELECT column1, column2 FROM ...- คุณสามารถใส่นิพจน์ที่ซับซ้อนได้ที่นี่:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }จะให้คอลัมน์ที่มีชื่อว่าmaxถือค่าสูงสุดเป็นcolumn1

whereClause

  • ส่วนที่คุณใส่หลังจากWHEREไม่มีคำสำคัญนั้นเช่น"column1 > 5"
  • ควรรวม?ไว้สำหรับสิ่งที่เป็นไดนามิกเช่น"column1=?"-> ดูwhereArgs

whereArgs

  • ระบุเนื้อหาที่เติมแต่ละ?ในwhereClauseลำดับที่ปรากฏ

คนอื่น ๆ

  • เช่นเดียวwhereClauseกับคำสั่งหลังคำหลักหรือnullหากคุณไม่ได้ใช้

ตัวอย่าง

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

เทียบเท่ากับแบบสอบถามดิบต่อไปนี้

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

โดยใช้ที่ไหน / รุ่นผูก -Args 'คุณจะได้รับค่าหนีโดยอัตโนมัติและคุณจะได้ไม่ต้องกังวลถ้าใส่ข้อมูลประกอบด้วย

ไม่ปลอดภัย: String whereClause = "column1='" + value + "'";
ปลอดภัย:String whereClause = "column1=?";

เพราะหากค่ามี'คำสั่งของคุณแตกและคุณได้รับข้อยกเว้นหรือทำสิ่งที่ไม่ได้ตั้งใจตัวอย่างเช่นvalue = "XYZ'; DROP TABLE table1;--"อาจทำให้โต๊ะของคุณหล่นเนื่องจากคำสั่งจะกลายเป็นสองคำสั่งและความคิดเห็น:

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

การใช้เวอร์ชัน args XYZ'; DROP TABLE table1;--จะถูกหลีกเลี่ยง'XYZ''; DROP TABLE table1;--'และจะถือว่าเป็นค่าเท่านั้น แม้ว่า'จะไม่ได้มีเจตนาที่จะทำสิ่งที่ไม่ดี แต่ก็ยังคงเป็นเรื่องธรรมดาที่ผู้คนจะมีมันในชื่อของพวกเขาหรือใช้ในข้อความชื่อไฟล์รหัสผ่าน ฯลฯ ดังนั้นควรใช้เวอร์ชัน args เสมอ (สามารถสร้างintและสิ่งดั้งเดิมอื่น ๆ ได้โดยตรงwhereClause)


Limit / offset ตกอยู่ตรงไหน ... จัดกลุ่มตาม? มี? สั่งโดย?
Lion789

3
@ Lion789 มีหลายเวอร์ชันที่มีlimitพารามิเตอร์เช่นdeveloper.android.com/reference/android/database/sqlite/…มันเป็นเพียงการต่อข้อความง่ายๆในตอนท้ายเพื่อให้คุณสามารถใส่เช่น"some_column LIMIT 10"เข้าไปorderByและมันจะยังคงใช้งานได้
zapl

มีตัวเลือกให้เข้าร่วม 2 โต๊ะไหม
Vijay Kumbhoje

2
@VijayKumbhoje คุณควรจะใส่เช่นtable1 CROSS JOIN table2ชื่อตารางได้ แต่มีจุดหนึ่งที่ฉันจะดู rawquery: stackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhoje อะไรก็ได้ที่คุณรู้สึกสบายใจ / ดูสะอาดขึ้นในที่สุด queryวิธีการเป็นเพียงการเพิ่มคำหลักไม่กี่เช่นSELECTและFROMการขัดแย้ง(ดูต้นฉบับ)จากนั้นทำrawQueryกับสตริงการสืบค้นที่เกิด หากคำค้นหาของคุณไม่เข้ากับอาร์กิวเมนต์ที่มีให้queryเขียนสตริงการสืบค้นด้วยตัวคุณเอง
zapl

21

นี่เป็นคำตอบที่กว้างขึ้นเพื่อเป็นข้อมูลอ้างอิงอย่างรวดเร็วสำหรับผู้ชมในอนาคต

ตัวอย่าง

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

คำอธิบายจากเอกสาร

  • table String: ชื่อตารางที่จะรวบรวมแบบสอบถาม
  • columns สตริง: รายการของคอลัมน์ที่จะส่งคืน การผ่านค่า null จะส่งคืนคอลัมน์ทั้งหมดซึ่งไม่แนะนำให้ป้องกันการอ่านข้อมูลจากที่เก็บข้อมูลที่จะไม่ถูกใช้
  • selection สตริง: ตัวกรองที่ประกาศว่าจะส่งคืนแถวใดจัดรูปแบบเป็นส่วนคำสั่ง SQL WHERE (ไม่รวม WHERE เอง) การผ่าน null จะส่งคืนแถวทั้งหมดสำหรับตารางที่กำหนด
  • selectionArgs สตริง: คุณอาจรวมไว้ในส่วนที่เลือกซึ่งจะถูกแทนที่ด้วยค่าจาก selectionArgs เพื่อให้ปรากฏในส่วนที่เลือก ค่าจะถูกผูกเป็นสตริง
  • groupBy String: ตัวกรองที่ประกาศวิธีการจัดกลุ่มแถวโดยจัดรูปแบบเป็นคำสั่ง SQL GROUP BY (ไม่รวม GROUP BY เอง) การผ่านค่าว่างจะทำให้แถวไม่ถูกจัดกลุ่ม
  • having สตริง: ตัวกรองประกาศว่ากลุ่มแถวใดที่จะรวมไว้ในเคอร์เซอร์หากมีการใช้การจัดกลุ่มแถวจัดรูปแบบเป็นส่วนคำสั่ง SQL HAVING (ไม่รวม HAVING เอง) การผ่านค่า null จะทำให้กลุ่มแถวทั้งหมดถูกรวมและจำเป็นเมื่อไม่ได้ใช้การจัดกลุ่มแถว
  • orderBy String: วิธีเรียงลำดับแถวโดยจัดรูปแบบเป็น SQL ORDER BY clause (ไม่รวม ORDER BY เอง) การผ่าน null จะใช้ลำดับการจัดเรียงเริ่มต้นซึ่งอาจไม่เรียงลำดับ
  • limit สตริง: จำกัด จำนวนแถวที่ส่งคืนโดยแบบสอบถามโดยจัดรูปแบบเป็น LIMIT อนุประโยค การส่งค่า null แสดงว่าไม่มีส่วนคำสั่ง LIMIT

16

โดยที่ส่วนคำสั่งและ args ทำงานร่วมกันเพื่อสร้างคำสั่ง WHERE ของแบบสอบถาม SQL ดังนั้นบอกว่าคุณต้องการแสดงออก

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

จากนั้น whereClause และ whereArgs ของคุณจะเป็นดังนี้

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

หากคุณต้องการเลือกคอลัมน์ตารางทั้งหมดฉันเชื่อว่าสตริงว่างที่ส่งไปยัง tableColumns จะเพียงพอ


อย่าใส่?ไว้'ซึ่ง'จะถูกเพิ่มโดยอัตโนมัติหากจำเป็น
zapl

1

หากแบบสอบถาม SQL ของคุณเป็นเช่นนี้

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;

จากนั้นสำหรับวิธีการ query () เราสามารถทำได้ดังนี้: -

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 + "=" + rowIDนี่=คือwhereประโยค ในการเลือกค่าทั้งหมดคุณจะต้องตั้งชื่อคอลัมน์ทั้งหมด:

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

และนี่คือบทช่วยสอนที่ดีสำหรับฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.