【问题标题】:CursorOutofBoundsException Index -1 requested with size of 0CursorOutofBoundsException 索引 -1 请求大小为 0
【发布时间】:2017-12-24 08:23:07
【问题描述】:

我有一个名为 updateparty 的数据库,我必须从中创建一个 hashmap 字符串类型的数组列表。当我尝试从 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;
}

这是错误信息:

我需要从这个数据库创建一个数组列表

【问题讨论】:

  • 这一行给出了错误:while(c.moveToNext())。这是由于光标为空(查询没有返回任何记录)造成的。
  • 是的..查询错误.!!!!!!
  • 不管怎样,在光标之间移动之前,一定要检查光标是否有记录。
  • 如何检查

标签: android android-sqlite android-cursor android-database


【解决方案1】:

将您的插入代码更改为:

            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();
        }

【讨论】:

    【解决方案2】:

    使用如下代码,while循环应该是这样的: while(!c.isAfterLast())

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 2016-02-09
      • 2012-05-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多