3

入力したユーザー名が見つからない場合、何らかの理由でアプリケーションがクラッシュします。しかし、ユーザー名が見つかると、完璧に動作するように見えます。返されたカーソル == null かどうかもチェックします。コードはこちら

    public boolean isUserAuthenticated(String username, String password) {
    // TODO Auto-generated method stub
    boolean authenticated = false;
    String[] columns = new String[] {LOGIN_USERNAME, LOGIN_PASSWORD};
    String sqlUsername = "\"" + username + "\"";
    Cursor c = ourDatabase.query(LOGIN_TABLE, columns, LOGIN_USERNAME + "="+ sqlUsername, null, null, null, null);
    if (c != null) {
        c.moveToFirst();
        String passwordAttachedToUsername = c.getString(1);
        if(passwordAttachedToUsername.equals(password)) {
            authenticated = true;
        }
    }

    return authenticated;
}
4

5 に答える 5

3

Cursor オブジェクトは null ではないかもしれませんが、その結果セットのサイズは 0 です。代わりに:

if (c != null) {
    ...
}

試す:

if (c.getCount() > 0) {
    ...
}

また、@mu の言及が短すぎるため、条件で c.moveToFirst() の戻り値を使用することもできます。

if (c.moveToFirst()) {
    String passwordAttachedToUsername = c.getString(1);
    if (passwordAttachedToUsername.equals(password)) {
        authenticated = true;
    }
}
于 2012-05-04T02:14:27.860 に答える
2

まず、条件は次のとおりです。

if (c != null && c.getCount() > 0)

第二に、リファクタリングできます

String passwordAttachedToUsername = c.getString(1);
if(passwordAttachedToUsername.equals(password)) {
    authenticated = true;
    }

代わりにこれで:

authenticated = password.equals(c.getString(1));
于 2012-05-04T02:19:50.727 に答える
1

変化する:

if (c != null) {
    c.moveToFirst();
    ...
}

if (c != null && c.moveToFirst()) {
    ...
}

c != nullカーソルのサイズが 0 より大きい場合に true を返します。

于 2012-05-04T02:23:28.650 に答える
0

queryコマンドは常にカーソルを返すため、null のテストは常に失敗します。を使用して、カーソルに含まれるカウントを確認する必要がありますcursor.getCount()

于 2012-05-04T02:18:25.830 に答える