Truy vấn SQLite trong Android để đếm hàng


91

Tôi đang cố tạo một biểu mẫu Đăng nhập đơn giản, nơi tôi so sánh id đăng nhập và mật khẩu đã nhập ở màn hình đăng nhập với biểu mẫu được lưu trữ trong cơ sở dữ liệu.

Tôi đang sử dụng truy vấn sau:

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

Vấn đề là, tôi không biết, làm thế nào tôi có thể thực hiện truy vấn trên và lưu trữ số lượng được trả về.

Đây là cách bảng cơ sở dữ liệu trông như thế nào (Tôi đã cố gắng tạo cơ sở dữ liệu thành công bằng cách sử dụng phương thức executeSQl)

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

Ai đó có thể vui lòng hướng dẫn tôi cách tôi có thể đạt được điều này không? Nếu có thể, vui lòng cung cấp một đoạn mã mẫu để thực hiện nhiệm vụ trên.

Câu trả lời:


121

DatabaseUtils.queryNumEntries (kể từ api: 11) là giải pháp thay thế hữu ích phủ nhận nhu cầu về SQL thô (yay!).

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

đối với OS <11, nó bị lỗi NoSuchMethodError, có giải pháp nào để hỗ trợ cho OS <11 không?
Khobaib

2
@Khobaib Kiểm tra câu trả lời từ ghchinoy
Eduardo Herzer

1
@EduardoHerzer Tôi đã tìm thấy một cách trực tiếp với cursor.getCount ().
Khobaib

1
@Khobaib Đó không phải là một cách làm hiệu quả. Bạn nên luôn thích sử dụng SELECT COUNT(*)queryNumEntries()truy xuất tất cả các bản ghi và xem có bao nhiêu bản ghi, tức là. cursor.getCount()
DearVolt, 13/07/17

114

@scottyab DatabaseUtils.queryNumEntries được tham số hóa (db, table, whereparams) tồn tại ở API 11 +, một không có whereparams tồn tại kể từ API 1 . Câu trả lời sẽ là tạo Con trỏ với 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();

Tôi cũng thích câu trả lời của @ Dre, với truy vấn được tham số hóa.


1
Đối với những người tự hỏi, tham số cho mCount.getInt()columnindex. Cảm ơn bạn vì sự giúp đỡ!
T.Woody

62

Sử dụng SQLiteStatement .

ví dụ

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

  long count = s.simpleQueryForLong();

1
Một điều tôi thích về câu trả lời này so với câu trả lời của @ scottyab (điều này cũng thực sự tốt) là bạn có thể chỉ định điều khoản LIMIT trong trường hợp này. Điều này hữu ích khi bạn chỉ muốn biết liệu có BẤT KỲ hàng nào trong bảng (ví dụ: chọn (đếm (*)> 0) từ TABLE LIMIT 1) so với không có hàng nào. Tôi đoán điều đó sẽ nhanh hơn khi bảng có thể không có hàng hoặc hàng tấn hàng. Đây là trường hợp cụ thể mà tôi gặp phải khi tìm kiếm điều này ...
stickj

@Teknogrebo: Đây là một câu trả lời hay, mặc dù tôi sẽ sử dụng phiên bản được tham số hóa. Bạn có thể sử dụng ?s trong truy vấn, sau đó sử dụng bindString(int, String)bindLong(int, long)để chèn các giá trị. Xem tại đây .
DearVolt, 13/07/17

22

Xem rawQuery (String, String []) và tài liệu về Cursor

Câu lệnh SQL DADABASE_COMPARE của bạn hiện không hợp lệ loginnameloginpasssẽ không được thoát, không có khoảng cách giữa loginnameandvà và bạn kết thúc câu lệnh bằng); thay vì ; - Nếu bạn đang đăng nhập bằng bob bằng mật khẩu của mật khẩu, câu lệnh đó sẽ kết thúc là

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

Ngoài ra, bạn có thể nên sử dụng tính năng selectArgs, thay vì nối tên đăng nhập và đăng nhập.

Để sử dụng selectArgs bạn sẽ làm như thế nào

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

Giả sử bạn đã dbthiết lập kết nối Cơ sở dữ liệu ( ), tôi nghĩ cách tốt nhất là gắn bó với Cursorlớp và làm điều gì đó như:

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
Ít nhất bạn nên chỉ định một cột. Chuyển null sẽ trả về tất cả các cột, điều này không được khuyến khích để ngăn việc đọc dữ liệu từ bộ nhớ sẽ không được sử dụng. #perfmatters
redochka

Trong thực tế nếu các thông tin cần thiết chỉ là một số, lấy một cột duy nhất (ID chẳng hạn) sẽ là quá đủ
Eloi Navarro

12

cách lấy cột đếm

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

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

Đây là sự thay thế ngắn gọn và chính xác nhất. Không cần xử lý con trỏ và đóng của chúng.


Thật tuyệt vời - đã làm việc với Android từ mãi mãi và chưa bao giờ biết về DatabaseUtils này - Google nên quảng cáo tốt hơn ở đó ...
slott

6

Nếu bạn đang sử dụng ContentProvider thì bạn có thể sử dụng:

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

5

Một cách khác sẽ được sử dụng:

myCursor.getCount();

trên con trỏ như:

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

Nếu bạn có thể nghĩ đến việc thoát khỏi truy vấn thô.


5

Nếu bạn muốn có được số lượng bản ghi thì bạn phải áp dụng nhóm theo một số trường hoặc áp dụng truy vấn bên dưới.

Giống

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

1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.