0

ユーザー名だけで Android のログイン システムを使用したいと考えています。以下のコードは最初の行でのみ機能します (たとえば、私のデータベースには名前があります: 1- Joseph 2 - Najib 。Joseph を入力すると正常に動作しますが、Najib または DB に存在しないその他の値を入力すると、プログラムどうやらこのコードを修正してメッセージ (DB にあるユーザー名または無効なユーザー名) を返すにはどうすればよいですか? while ステートメントにエラーはありますか?

public void checklogin() {

    DatabaseHelper dbh = new DatabaseHelper(LoginActivity.this);
    DatabaseAdapter dba = new DatabaseAdapter(LoginActivity.this);
    db = dbh.getWritableDatabase();
    TextView usernametry = (TextView) findViewById(R.id.usernametry);
    String usertry = usernametry.getText().toString();

    String[] allColumnsofuserstable = { dba.COLUMN_ID, dba.COLUMN_NAME,
            dba.COLUMN_AGE, dba.COLUMN_GENDER, dba.COLUMN_WEIGHT,
            dba.COLUMN_HEIGHT, dba.COLUMN_CALORIES };

    Log.d("TAG", usertry);

    Cursor mCursor = db.query(dba.TABLE_USERS,
            new String[] { dba.COLUMN_NAME }, null, null, null, null, null,

    mCursor.moveToNext();
    while (!mCursor.isAfterLast()) {
        String k = mCursor.getString(0);
        if (k.equalsIgnoreCase(usertry)) {
            Toast.makeText(LoginActivity.this,
                    "Logged in as " + mCursor.getString(0).toString(),
                    Toast.LENGTH_LONG).show();
            mCursor.moveToNext();
        } else
            Toast.makeText(LoginActivity.this, "invalid username",
                    Toast.LENGTH_LONG).show();
    }

    mCursor.close();
    dbh.close();
    return;
}
4

2 に答える 2

1

すべての結果を取得して検索をループするのではなく、文字列を検索するようにクエリを変更することをお勧めします。

Cursor mCursor = db.query(dba.TABLE_USERS,
new String[] { dba.COLUMN_NAME }, dba.COLUMN_NAME + "=?", new String[]{usertry},
null, null, null);
于 2012-04-23T21:17:04.690 に答える
0

mCursor.moveToNext();データベースでユーザー名が見つかった場合にのみカーソル ( ) 内でポインターを移動するため、ループが壊れています。カーソルは最後のアイテムの後に移動できず、while (!mCursor.isAfterLast())停止することはありません。

常にカーソルを移動するようにする必要があります。例:

Cursor mCursor = db.query(dba.TABLE_USERS,
        new String[] { dba.COLUMN_NAME }, null, null, null, null, null,

boolean loggedIn = false;
while (mCursor.moveToNext()) {
    String k = mCursor.getString(0);
    if (k.equalsIgnoreCase(usertry)) {
        Toast.makeText(LoginActivity.this,
                "Logged in as " + mCursor.getString(0).toString(),
                Toast.LENGTH_LONG).show();
        loggedIn = true;
        break;
    }
}
if (!loggedIn)
        Toast.makeText(LoginActivity.this, "invalid username",
                Toast.LENGTH_LONG).show();

または、クエリを変更して (@Waqas を参照)、代わりに作業を行います ( LIKE ?= equalsIgnoreCase= ?= equals)

Cursor mCursor = db.query(dba.TABLE_USERS,
    new String[] { dba.COLUMN_NAME }, dba.COLUMN_NAME + " LIKE ?", new String[]{usertry},
    null, null, null);

if (mCursor.moveToFirst()) {
    String k = mCursor.getString(0);
    Toast.makeText(LoginActivity.this,
            "Logged in as " + mCursor.getString(0).toString(),
            Toast.LENGTH_LONG).show();
} else {
        Toast.makeText(LoginActivity.this, "invalid username",
                Toast.LENGTH_LONG).show();
}
于 2012-04-23T21:51:27.457 に答える