2012-04-23 80 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

讓你的問題更清晰的觀衆。 – 2012-04-23 21:12:24

回答

0

你的廁所p被破壞,因爲只有在光標(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(); 
} 
+0

嗯,雖然我使用了兩個代碼,但它仍然給我najib無效的用戶名,雖然我可以看到它在我的電腦! – callback 2012-04-23 21:59:07

+0

你怎麼看你的桌子?這是不可能的,你可以看到它,但兩種方法都告訴你用戶名不存在。 – zapl 2012-04-23 22:03:06

+0

我只是刷新數據庫和apprently行「najib」不存在了,我想這是因爲我手動輸入它。 有沒有什麼辦法可以得到遊標返回的用戶名? – callback 2012-04-23 22:12:38

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。此, \t \t \t \t 「已登錄爲」 + usertry, \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 2012-04-23 21:25:48

+0

更改'mCursor.moveToNext();'到'mCursor.moveToFirst();' – waqaslam 2012-04-23 21:29:03

+0

我的新代碼中沒有任何movetonext()?或者你在談論第一個代碼? – callback 2012-04-23 21:39:04