CursorOutofBoundsException索引-1请求的大小为0

问题描述:

我有一个名为updateparty的数据库,我必须从中创建一个hashmap string类型的数组列表。当我尝试从数据库检索数据时,光标不会移动到下一个记录。CursorOutofBoundsException索引-1请求的大小为0

这里是db插入代码。

for (int i = 0; i < poslist.size(); i++) { 


       SQLiteDatabase db7 = db.getWritableDatabase(); 
       ContentValues values5= new ContentValues(); 
       values5.put(DBManager.TableInfo.KEYID, ID1); 
       values5.put(DBManager.TableInfo.DOCU, document); 
       values5.put(DBManager.TableInfo.ATTEND,attendancelist.get(i)); 
       values5.put(DBManager.TableInfo.EMAIL, emaillist.get(i)); 
       values5.put(DBManager.TableInfo.PARTY,partytypelist.get(i)); 
       values5.put(DBManager.TableInfo.BIO,biometriclist.get(i)); 
       values5.put(DBManager.TableInfo.KEY_LOGIN_USER,username2); 
       String condition5 = DBManager.TableInfo.DOCU + " =?"; 
       Cursor cursor5 = db7.query(DBManager.TableInfo.UPDATEPARTY, null, condition5, new String[]{DBManager.TableInfo.ATTEND}, null, null, null); 
       long status5 = db7.insert(DBManager.TableInfo.UPDATEPARTY, null, values5); 
       System.out.println("Parties insert : " + status5); 
       cursor5.close(); 
       db7.close(); 
      } 

代码从上述DB创建的ArrayList:

public ArrayList<HashMap<String, String>>getPartypost(DBOperation db) { 
    ArrayList<HashMap<String, String>> listParties11 = new ArrayList<HashMap<String, String>>(); 

    try { 

     String query = "select * from " + DBManager.TableInfo.UPDATEPARTY + " where " + DBManager.TableInfo.KEY_LOGIN_USER + " = '" + GenericMethods.email + "'"; 
     System.out.println("query:"+query); 
     SQLiteDatabase sqlite1 = db.getWritableDatabase(); 
     Cursor c = sqlite1.rawQuery(query, null); 

     while(c.moveToNext()) { 
        HashMap<String, String> selectiondetails10 = new HashMap<String, String>(); 
      System.out.println("value:"+c.getString(c.getColumnIndex(DBManager.TableInfo.DOCU))); 
        selectiondetails10.put("document_id", c.getString(c.getColumnIndex(DBManager.TableInfo.DOCU))); 
        selectiondetails10.put("att_id", c.getString(c.getColumnIndex(DBManager.TableInfo.ATTEND))); 
        selectiondetails10.put("email", c.getString(c.getColumnIndex(DBManager.TableInfo.EMAIL))); 
        selectiondetails10.put("party_type", c.getString(c.getColumnIndex(DBManager.TableInfo.PARTY))); 
        selectiondetails10.put("biometric", c.getString(c.getColumnIndex(DBManager.TableInfo.BIO))); 
        selectiondetails10.put("exec_email", c.getString(c.getColumnIndex(DBManager.TableInfo.KEY_LOGIN_USER))); 

        listParties11.add(selectiondetails10); 

       } 

       closeCursor(c); 
      //} 
     // } 
     System.out.println("list size:"+listParties11.size()); 
     } catch (Exception e) { 
     // TODO: handle exception. 
     e.printStackTrace(); 
    } 
    db.close(); 
    return listParties11; 
} 

这是错误消息:

enter image description here

我需要的是建立一个数组列表,从这个数据库

+0

错误是由该行给出的(c.isAfterLast()!):'而(c.moveToNext ())'。它是由光标为空(查询没有返回任何记录)引起的。 –

+0

是的..查询是错误的。 – user7245

+0

无论如何,在移动它们之前,总要检查光标是否有记录。 –

将您的插入代码更改为:

  SQLiteDatabase db7 = db.getWritableDatabase(); 
      ContentValues values5= new ContentValues(); 
      for (int i = 0; i < poslist.size(); i++) { 
      values5.put(DBManager.TableInfo.KEYID, ID1); 
      values5.put(DBManager.TableInfo.DOCU, document); 
      values5.put(DBManager.TableInfo.ATTEND,attendancelist.get(i)); 
      values5.put(DBManager.TableInfo.EMAIL, emaillist.get(i)); 
      values5.put(DBManager.TableInfo.PARTY,partytypelist.get(i)); 
      values5.put(DBManager.TableInfo.BIO,biometriclist.get(i)); 
      values5.put(DBManager.TableInfo.KEY_LOGIN_USER,username2); 
      String condition5 = DBManager.TableInfo.DOCU + " =?"; 
      Cursor cursor5 = db7.query(DBManager.TableInfo.UPDATEPARTY, null, condition5, new String[]{DBManager.TableInfo.ATTEND}, null, null, null); 
      long status5 = db7.insert(DBManager.TableInfo.UPDATEPARTY, null, values5); 
      System.out.println("Parties insert : " + status5); 
      cursor5.close(); 
      db7.close(); 
     } 

使用下面的代码,while循环应该是这样的:

public ArrayList<HashMap<String, String>>getPartypost(DBOperation db) { 
    ArrayList<HashMap<String, String>> listParties11 = new ArrayList<HashMap<String, String>>(); 

    try { 

     String query = "select * from " + DBManager.TableInfo.UPDATEPARTY + " where " + DBManager.TableInfo.KEY_LOGIN_USER + " = '" + GenericMethods.email + "'"; 
     System.out.println("query:"+query); 
     SQLiteDatabase sqlite1 = db.getWritableDatabase(); 
     Cursor c = sqlite1.rawQuery(query, null); 
      c.moveToFirst(); 
     while(!c.isAfterLast()) { 
        HashMap<String, String> selectiondetails10 = new HashMap<String, String>(); 
      System.out.println("value:"+c.getString(c.getColumnIndex(DBManager.TableInfo.DOCU))); 
        selectiondetails10.put("document_id", c.getString(c.getColumnIndex(DBManager.TableInfo.DOCU))); 
        selectiondetails10.put("att_id", c.getString(c.getColumnIndex(DBManager.TableInfo.ATTEND))); 
        selectiondetails10.put("email", c.getString(c.getColumnIndex(DBManager.TableInfo.EMAIL))); 
        selectiondetails10.put("party_type", c.getString(c.getColumnIndex(DBManager.TableInfo.PARTY))); 
        selectiondetails10.put("biometric", c.getString(c.getColumnIndex(DBManager.TableInfo.BIO))); 
        selectiondetails10.put("exec_email", c.getString(c.getColumnIndex(DBManager.TableInfo.KEY_LOGIN_USER))); 

        listParties11.add(selectiondetails10); 
c.moveToNext(); 
       } 

       closeCursor(c); 
      //} 
     // } 
     System.out.println("list size:"+listParties11.size()); 
     } catch (Exception e) { 
     // TODO: handle exception. 
     e.printStackTrace(); 
    } 
    db.close(); 
    return listParties11; 
}