SQLite Query ใน Android เพื่อนับแถว


92

ฉันกำลังพยายามสร้างแบบฟอร์มการเข้าสู่ระบบแบบธรรมดาโดยที่ฉันเปรียบเทียบ ID ล็อกอินและรหัสผ่านที่ป้อนที่หน้าจอล็อกอินกับที่เก็บไว้ในฐานข้อมูล

ฉันใช้แบบสอบถามต่อไปนี้:

final String DATABASE_COMPARE =
"select count(*) from users where uname=" + loginname + "and pwd=" + loginpass + ");" ;

ปัญหาคือฉันไม่ทราบว่าฉันจะดำเนินการค้นหาข้างต้นและจัดเก็บจำนวนที่ส่งคืนได้อย่างไร

นี่คือลักษณะของตารางฐานข้อมูล (ฉันสับสนในการสร้างฐานข้อมูลโดยใช้วิธี execSQl)

private static final String
DATABASE_CREATE =
            "create table users (_id integer autoincrement, "
            + "name text not null, uname primary key text not null, " 
            + "pwd text not null);";//+"phoneno text not null);";

ใครช่วยแนะนำฉันหน่อยได้ไหมว่าฉันจะบรรลุเป้าหมายนี้ หากเป็นไปได้โปรดให้ข้อมูลโค้ดตัวอย่างเพื่อทำงานข้างต้น

คำตอบ:


122

DatabaseUtils.queryNumEntries (ตั้งแต่ api: 11) เป็นทางเลือกที่มีประโยชน์ที่ลบล้างความต้องการ SQL ดิบ (เย้!)

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});

สำหรับ OS <11 มันได้รับข้อผิดพลาด NoSuchMethodError มีวิธีแก้ไขเพื่อรองรับ OS <11 หรือไม่
Khobaib

2
@Khobaib ตรวจคำตอบจาก ghchinoy
Eduardo Herzer

1
@EduardoHerzer ฉันพบวิธีกับ cursor.getCount () โดยตรง
คบกัน

1
@Khobaib นั่นไม่ใช่วิธีที่มีประสิทธิภาพมากนัก คุณควรเลือกใช้SELECT COUNT(*)และqueryNumEntries()ดึงข้อมูลบันทึกทั้งหมดมากกว่าและดูว่ามีจำนวนเท่าใดเช่น cursor.getCount()
DearVolt

115

@scottyab parametrized DatabaseUtils.queryNumEntries (DB ตาราง whereparams)อยู่ที่ 11 + API หนึ่งโดยไม่ต้อง whereparams ที่มีอยู่ตั้งแต่ API 1 คำตอบจะต้องสร้าง Cursor ด้วย db.rawQuery:

Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null);
mCount.moveToFirst();
int count= mCount.getInt(0);
mCount.close();

ฉันชอบคำตอบของ @ Dre ด้วยแบบสอบถามที่กำหนดพารามิเตอร์


1
สำหรับผู้ที่สงสัยพารามิเตอร์สำหรับการมีmCount.getInt() columnindexขอบคุณสำหรับความช่วยเหลือ!
ทีวู้ดดี้

62

ใช้SQLiteStatement

เช่น

 SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );

  long count = s.simpleQueryForLong();

1
สิ่งหนึ่งที่ฉันชอบเกี่ยวกับคำตอบนี้เทียบกับคำตอบของ @ scottyab (ซึ่งก็ดีมากเช่นกัน) คือคุณสามารถระบุส่วนคำสั่ง LIMIT ในกรณีนี้ได้ สิ่งนี้มีประโยชน์เมื่อคุณต้องการทราบว่ามีแถวใด ๆ ในตาราง (เช่นเลือก (count (*)> 0) จาก TABLE LIMIT 1) เทียบกับไม่มีแถว ฉันเดาว่ามันจะเร็วขึ้นเมื่อตารางไม่มีแถวหรือแถวเป็นตัน นี่เป็นกรณีเฉพาะที่ฉันพบเมื่อค้นหาสิ่งนี้ ...
ติดอยู่

@Teknogrebo: นี่เป็นคำตอบที่ดีแม้ว่าฉันจะใช้เวอร์ชันที่กำหนดพารามิเตอร์ คุณสามารถใช้?s ในแบบสอบถามจากนั้นใช้bindString(int, String)และbindLong(int, long)เพื่อแทรกค่า ดูที่นี่ .
DearVolt

23

ดูrawQuery (String, String [])และเอกสารสำหรับCursor

คำสั่ง DADABASE_COMPARE SQL ของคุณไม่ถูกต้องในขณะนี้loginnameและloginpassจะไม่ถูก Escape ไม่มีช่องว่างระหว่างloginnameและandและคุณปิดท้ายคำสั่งด้วย); แทน ; - หากคุณเข้าสู่ระบบด้วยรหัสผ่านบ๊อบคำสั่งนั้นจะจบลงด้วย

select count(*) from users where uname=boband pwd=password);

นอกจากนี้คุณควรใช้คุณสมบัติ selectionArgs แทนการเชื่อมต่อชื่อล็อกอินและรหัสผ่านเข้าสู่ระบบ

ในการใช้ selectionArgs คุณต้องทำสิ่งที่ต้องการ

final String SQL_STATEMENT = "SELECT COUNT(*) FROM users WHERE uname=? AND pwd=?";

private void someMethod() {
    Cursor c = db.rawQuery(SQL_STATEMENT, new String[] { loginname, loginpass });
    ...
}

22

สมมติว่าคุณมีการdbเชื่อมต่อฐานข้อมูล ( ) แล้วฉันคิดว่าวิธีที่ดีที่สุดคือยึดติดกับCursorชั้นเรียนและทำสิ่งที่ชอบ:

String selection = "uname = ? AND pwd = ?";
String[] selectionArgs = {loginname, loginpass};
String tableName = "YourTable";
Cursor c = db.query(tableName, null, selection, selectionArgs, null, null, null);
int result = c.getCount();
c.close();
return result;

2
อย่างน้อยคุณควรระบุคอลัมน์ การผ่านค่า null จะส่งคืนคอลัมน์ทั้งหมดซึ่งไม่แนะนำให้ป้องกันการอ่านข้อมูลจากที่เก็บข้อมูลที่จะไม่ถูกใช้ #perfmatters
redochka

ในความเป็นจริงหากข้อมูลที่จำเป็นเป็นเพียงการนับการดึงข้อมูลคอลัมน์เดียว (เช่น ID) จะเกินพอ
Eloi Navarro

12

วิธีรับคอลัมน์การนับ

final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;

int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);

นี่เป็นทางเลือกที่กระชับและแม่นยำที่สุด ไม่จำเป็นต้องจัดการกับเคอร์เซอร์และการปิด


น่าทึ่ง - ทำงานร่วมกับ Android มาตลอดและไม่เคยรู้เกี่ยวกับ DatabaseUtils นี้มาก่อน - Google ควรจะดีกว่าในการส่งเสริมเครื่องมือที่นั่น ...
slott

6

หากคุณใช้ ContentProvider คุณสามารถใช้:

Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
            uname=" + loginname + " and pwd=" + loginpass, null, null);
    cursor.moveToFirst();
    int count = cursor.getInt(0);

6

หากคุณต้องการรับจำนวนระเบียนคุณต้องใช้กลุ่มตามบางฟิลด์หรือใช้แบบสอบถามด้านล่าง

ชอบ

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);

5

อีกวิธีหนึ่งคือการใช้:

myCursor.getCount();

บนเคอร์เซอร์เช่น:

Cursor myCursor = db.query(table_Name, new String[] { row_Username }, 
row_Username + " =? AND " + row_Password + " =?",
new String[] { entered_Password, entered_Password }, 
null, null, null);

หากคุณสามารถคิดที่จะหลีกหนีจากแบบสอบถามดิบ


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