0

カーソルインデックスが範囲外になっています"インデックス0が要求されました:サイズ0で。その単なるユーザー登録とログインアプリケーション。ユーザー名とパスワードが一致するユーザーがいない場合、アプリケーションがクラッシュします。

以下はコードです:

MainActivity.java

final SUSQLiteHelper dbhelper = new SUSQLiteHelper(this);

LoginData login = dbhelper.readOneUser(loginuname.getText().toString(), loginpwd.getText().toString());

                if(login.getUname().toString().equals(loginuname.getText().toString()) && 
                        login.getPwd().toString().equals(loginpwd.getText().toString()))
                {
                    Toast.makeText(getApplicationContext(), "Login Successfull. Welcome " + login.getUname().toUpperCase() +" !".toString(), 
                            Toast.LENGTH_LONG).show();
                }
                else if(login.getUname().toString().equals(loginuname.getText().toString()) && 
                            !login.getPwd().toString().equals(loginpwd.getText().toString()))
                {                       
                    Toast.makeText(getApplicationContext(), "Login Failed. Incorrect password !", 
                            Toast.LENGTH_LONG).show();                      
                }
                else
                    Toast.makeText(getApplicationContext(), "Login Failed. User doesn't exist !", 
                            Toast.LENGTH_LONG).show(); //it never goes here if no username is found in the table

SUSQLiteHelper.java

    public LoginData readOneUser(String uname, String pwd)
{
    SQLiteDatabase loginUserDB = this.getReadableDatabase();
    LoginData newLogin = null;
    Cursor cursor = loginUserDB.query(TABLE_NAME, new String[]{TABLE_ROW_UNAME, TABLE_ROW_EMAIL, TABLE_ROW_PWD}, TABLE_ROW_UNAME + "=?",
            new String[]{String.valueOf(uname)}, null, null, null);

    if(cursor.moveToFirst())
    {
        newLogin = new LoginData(cursor.getString(0), cursor.getString(1), cursor.getString(2));
    }
    cursor.close();
    loginUserDB.close();
    return newLogin;
}

LoginData.java

このクラスには、Uname、Pwd、Emailフィールドのgetterメソッドとsetterメソッド、およびこれらのフィールドを引数として取るコンストラクターがあります。

4

2 に答える 2

0

関数readOneUser()で、以下を確認してください。

if(cursor.moveToFirst() && !cursor.isAfterLast()) {
     //
}
于 2013-01-09T15:18:46.060 に答える
0

CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

それはそれとを意味しcursor.moveToFirst() returns falseますCursor is empty。したがって、カーソルがnullであるかどうかを確認するためのスニペットを追加してみてください。これは、ロジックの変更に依存します。

public LoginData readOneUser(String uname, String pwd)
{
 SQLiteDatabase loginUserDB = this.getReadableDatabase();
 LoginData newLogin = null;
 Cursor cursor = loginUserDB.query(TABLE_NAME, new String[]{TABLE_ROW_UNAME, TABLE_ROW_EMAIL,TABLE_ROW_PWD}, TABLE_ROW_UNAME + "=?",new String[]{String.valueOf(uname)}, null, null, null);

  if(cursor!=null) //Check whether cursor is null or not
  {
   if(cursor.moveToFirst())
   {
     newLogin = new LoginData(cursor.getString(0), cursor.getString(1), cursor.getString(2));
   }
  }
cursor.close();
loginUserDB.close();
return newLogin;
 }

  LoginData login = dbhelper.readOneUser(loginuname.getText().toString(), loginpwd.getText().toString());
  if(login!=null)
   {
     //check for incorrect username or password
    }
  else
   {
     //Notify that no Username available with these Username
   }
于 2013-01-09T15:19:55.430 に答える