2012-04-23 4 views
0

사용자 이름 만있는 Android 시스템에서 로그인을 사용하고 싶습니다. 아래 코드는 첫 번째 행에 대해서만 작동합니다 (예 : 내 데이터베이스의 이름은 다음과 같습니다. : 1- Joseph 2 - Najib, Joseph을 입력해도 제대로 작동하지만 Najib 또는 내 DB에없는 다른 값을 입력하면 프로그램이 작동 함) 분명히 루프 계속 내가 메시지를 반환하는 코드를 수정할 수 있습니다 respond..How하지 않습니다 (어느 DB 또는 잘못된 사용자 이름에있는 사용자 이름) 따라? 내가 while 문에 오류가 있습니까?사용자 로그인은 Sqlite입니까?

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; 
} 
+0

관객에 더 명확하게 질문을합니다. –

답변

0

귀하의 화장실 사용자 이름이 데이터베이스에있는 경우 커서의 포인터 (mCursor.moveToNext();) 만 이동하기 때문에 p가 손상되었습니다. 커서는 마지막 항목 이후에 이동할 수 없으며 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 참조) 변경 (= equalsIgnoreCaseLIKE ? = 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(); 
} 
+0

흠, 두 코드를 모두 사용했지만 najib의 사용자 이름은 여전히 ​​잘못되었습니다. 내 태블릿에서도 볼 수 있습니다! – callback

+0

테이블에서 어떻게 보입니까? 당신이 볼 수있는 것은 불가능하지만, 두 가지 방법 모두 사용자 이름이 존재하지 않는다고 말합니다. – zapl

+0

방금 ​​데이터베이스를 새로 고치고 그 행 "najib"가 더 이상 존재하지 않는다고 생각합니다. 수동으로 입력했기 때문입니다. 커서로 반환 된 사용자 이름의 ID를 얻을 수있는 방법이 있습니까? – callback

1

가장 오히려 조회에 통해 모든 결과 및 루프를 얻는 것보다 문자열을 찾기 위해 쿼리를 수정하는 것입니다.

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

나는 당신의 문 다음에이 코드를 추가하고, 내 테이블의 두 번째 요소를 입력 할 때에 .. 내가 잘못이 유효하지만 \t \t 경우 (mCursor.moveToFirst()) {Toast.makeText (LoginActivity을 제공합니다. usertry + "로 로그인"이, \t \t \t \t, \t \t \t \t Toast.LENGTH_LONG) .show(); \t \t \t \t \t \t \t} 다른 \t \t \t \t Toast.makeText (LoginActivity.this, "잘못된 사용자 이름", \t \t \t \t \t \t Toast.LENGTH_LONG) .show(); \t \t \t \t \t \t \t mCursor.close(); \t \t dbh.close(); – callback

+0

mCursor.moveToNext();를 mCursor.moveToFirst();로 변경하십시오. – waqaslam

+0

새로운 코드에 movetonext()가 없습니다. 아니면 첫 번째 코드에 대해 이야기하고 있습니까? – callback

관련 문제