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