【问题标题】:CursorIndexOutOfBoundsException unable to resolveCursorIndexOutOfBoundsException 无法解决
【发布时间】:2013-01-09 14:55:55
【问题描述】:

我的游标索引超出范围“请求的索引 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 方法以及将这些字段作为参数的构造函数。

【问题讨论】:

  • @ePeace 这是我的日志... 01-09 19:12:16.440: E/AndroidRuntime(308): android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0跨度>

标签: android android-cursor


【解决方案1】:

CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

表示cursor.moveToFirst() returns falseCursor is empty。所以尝试添加 sn-p 来检查 cursor 是否为空,这取决于修改你的逻辑。

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
   }

【讨论】:

    【解决方案2】:

    在函数 readOneUser() 中,检查:

    if(cursor.moveToFirst() && !cursor.isAfterLast()) {
         //
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2012-10-11
      • 1970-01-01
      • 2016-03-30
      • 2018-04-21
      相关资源
      最近更新 更多