0

アプリケーションを作成しています。ユーザーが edittext フィールドにユーザー名を入力するログイン ページがあります。それは、すべてのユーザー名が存在するテーブルのエントリに対してユーザー名をチェックするデータベースヘルパー クラスの関数に渡されます。

データベースヘルパークラスの検証用に作成した関数は次のとおりです。

public String verify_user(String is_user)
{
    String verify = " ";
    String check = " ";
    SQLiteDatabase fg = this.getReadableDatabase();
    Cursor c = fg.query(Login_Table, null, null, null, null, null, null);
    int iuser = c.getColumnIndex(colUsername);
    for(c.moveToFirst() ; !c.isAfterLast();c.moveToNext())
    {
        verify = c.getString(iuser);
        if(is_user == verify)
        {
            check = "Valid User!";
        }
        else
        {
            check = "Not Valid User!";
        }
    }
    return check;

}

is_user は、ユーザーがユーザー名を入力する .xml レイアウト ファイルから来ています... デバッグすると、奇妙な動作が見つかりました。条件では is_user と verify はある時点で同じ値を持ちますが、それ以外は実行されます。ユーザーが有効であることを知っているので、このコードは有効なユーザーではありません! . 親切に私を案内してください。ありがとう!

新しい提案から:

String check = " ";
    SQLiteDatabase fg = this.getReadableDatabase();
    String[] args = new String[1];
    args[0] = is_user;
    Cursor c = fg.query(Login_Table, null, colUsername + " = ?", args, null, null, null);
    int iuser = c.getColumnIndex(colUsername);
    if(is_user.equals(c.getString(iuser)))
    {
        check = "Valid User!";
    }
    return check;
4

2 に答える 2

1

equals()Java では、ではなくを使用して文字列を比較します。==

if(is_user.equals(verify))

また、すべてのユーザーをループする必要はありません。代わりに、クエリに条件を追加するだけです。詳細については、ドキュメントを参照してください。

EDIT : 適切なクエリは次のようになります。

String[] args = new String[1];
args[0] = is_user;
Cursor c = fg.query(Login_Table, null, colUsername + " = ?", args, null, null, null);

常に引数を使用し、のように連結しないでください。これはSQL インジェクションcolUsername+"="+is_userに対して脆弱です。

于 2013-02-22T14:46:32.607 に答える
0

使用する

.equals(...).

if(is_user.equals(verify)){
...
于 2013-02-22T15:31:15.003 に答える