行をカウントするAndroidのSQLiteクエリ


91

ログイン画面で入力したログイン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);";

誰かがこれをどのように達成できるかについて親切に案内してくれますか?可能であれば、上記のタスクを実行するためのサンプルスニペットを提供してください。

回答:


121

DatabaseUtils.queryNumEntries(api:11以降)は、生のSQL(yay!)の必要性を否定する便利な代替手段です。

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

OS <11の場合、NoSuchMethodErrorエラーが発生します。OS<11をサポートするための回避策はありますか?
コバイブ2013

2
@Khobaib ghchinoyからの回答をチェック
Eduardo

1
@EduardoHerzer cursor.getCount()で直接方法を見つけました。
コバイブ2013年

1
@Khobaibこれは、非常に効率的な方法ではありません。すべてのレコードを使用SELECT COUNT(*)queryNumEntries()て取得することと、その数を確認することを常に優先する必要があります。cursor.getCount()
DearVolt 2017

114

@scottyabパラメータ化されたDatabaseUtils.queryNumEntries(db、table、whereparams)はAPI 11 +に存在します。API1以降、whereparamsがないものが存在します。答えは、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。お手伝いありがとう!
T.Woody

62

SQLiteStatementを使用する

例えば

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

  long count = s.simpleQueryForLong();

1
この回答と@scottyabの回答(これも非常に優れている)の比較で私が気に入っている点の1つは、この場合にLIMIT句を指定できることです。これは、テーブルに行があるかどうかを知りたいだけの場合に便利です(たとえば、テーブル制限1から(count(*)> 0)を選択する)か、行がないかを確認します。テーブルに行がない場合、または大量の行がある場合は、それが速くなると思います。これは、これを検索したときの具体的なケースです...
stuckj '29

@Teknogrebo:パラメータ化されたバージョンを使用しますが、これは良い答えです。?クエリでs を使用し、次にandを使用bindString(int, String)bindLong(int, long)て値を挿入できます。こちらをご覧ください
DearVolt 2017

22

rawQuery(String、String [])およびCursorのドキュメントを参照してください

あなたのDADABASE_COMPARE SQLステートメントは現在無効であり、loginnameかつloginpassエスケープされることはありません、そこの間にスペースはありませんloginnameand)、そしてあなたが文を終了します。の代わりに ; -passwordのパスワードでbobとしてログインしている場合、そのステートメントは次のようになります。

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

また、loginnameとloginpassを連結する代わりに、おそらく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
2015

実際、必要な情報が数だけの場合、単一の列(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);

これは最も簡潔で正確な代替手段です。カーソルとそのクローズを処理する必要はありません。


アメージング-永遠に、決してこのDatabaseUtilsについて知っていたので、アンドロイドに取り組んでき- Googleは、より良いそこutilsの促進であるべき...
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);

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

あなたが生のクエリから離れることを考えることができるなら。


5

レコード数を取得する場合は、いくつかのフィールドでグループ化を適用するか、以下のクエリを適用する必要があります。

お気に入り

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.