ログイン画面で入力されたログイン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);";
誰かが私にこれを達成する方法について親切に案内してくれますか?可能であれば、上記のタスクを実行するためのサンプルスニペットを提供してください。
DatabaseUtils.queryNumEntries (api:11以降)は、生のSQL(yay!)の必要性を否定する便利な代替手段です。
SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
"uname=? AND pwd=?", new String[] {loginname,loginpass});
@scottyabパラメーター化された DatabaseUtils.queryNumEntries(db、table、whereparams) はAPI 11 +に存在し、1つは API 1以降に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の回答も気に入っています。
SQLiteStatement を使用します。
例えば.
SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );
long count = s.simpleQueryForLong();
既にデータベース(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;
rawQuery(String、String []) および Cursor のドキュメントを参照してください
DADABASE_COMPARE SQLステートメントは現在無効です。loginname
とloginpass
はエスケープされません。loginname
とand
の間にスペースはなく、ステートメントをで終了します) ;の代わりに ; -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 });
...
}
final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;
int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);
これは、最も簡潔で正確な代替手段です。カーソルとそのクローズを処理する必要はありません。
ContentProviderを使用している場合は、次を使用できます。
Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
uname=" + loginname + " and pwd=" + loginpass, null, null);
cursor.moveToFirst();
int count = cursor.getInt(0);
別の方法は以下を使用することです:
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);
生のクエリから逃れることを考えることができる場合。
レコード数を取得したい場合は、いくつかのフィールドでグループを適用するか、以下のクエリを適用する必要があります。
db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();