SQLite游标出错

时间:2014-03-11 09:37:17

标签: android sqlite cursor

我正在尝试从sqlite中的表中获取所有项目,并且需要在列表视图中显示它。

以下是我获取商品的代码

public List<MenuData> getMenuItem(){
    SQLiteDatabase db;
    Cursor cursor=null;
    List<MenuData> menuList = new ArrayList<MenuData>();
    db=getReadableDatabase();
    String query ="SELECT * from "+TABLE_NAME_MENU;
    try{
    cursor = db.rawQuery (query, null );
    }
    catch (NullPointerException e){
        Log.e("Error","Null Pointer Exception");
    }

   if ( cursor.moveToFirst()) {
        do {
            MenuData menuData= new MenuData();
            menuData.setKEY_ITEM_NAME(cursor.getString(cursor.getColumnIndex(KEY_ITEM_NAME)));
           menuData.setKEY_ITEM_CATEGORY(cursor.getString(cursor.getColumnIndex(KEY_ITEM_CATEGORY)));
            menuData.setKEY_ITEM_CONTENTS(cursor.getString(cursor.getColumnIndex(KEY_ITEM_CONTENTS)));
            menuData.setKEY_ITEM_TYPE(cursor.getString(cursor.getColumnIndex(KEY_ITEM_TYPE)));
            menuData.setKEY_PRICE(cursor.getString(cursor.getColumnIndex(KEY_PRICE)));
            menuList.add(menuData);
        } while (cursor.moveToNext());
    }
   return menuList;

}

我的问题是我得到了表格最后一行的结果menuList,它在表格中有相同的行数。因此列表视图具有所有相同的项目。

4 个答案:

答案 0 :(得分:6)

MenuData menuData= new MenuData()移到do-while循环中,这样您就可以创建新对象,而不是一遍又一遍地更新同一个对象。

另外,更改

if (cursor!=null) {
    cursor.moveToFirst();

if (cursor.moveToFirst()) {

因此,如果没有结果行,您的代码不会崩溃。检查cursor != null不是必需的。

答案 1 :(得分:0)

使用此结构更正您的代码

if(cursor.getCount() != 0 && cursor != null)
{
 do
  {
    your values.. 
  }while(cursor.moveToNext())
} 

所有数据都存储MenuData,然后Menudata值附加到Listview ..

答案 2 :(得分:0)

您必须将最后一部分代码更改为:

if(cursor != null && cursor.getCount() > 0){
    while(cursor.moveToNext(){
       // your code
     }
}

...你确定这段代码中有问题吗? 检查你的datalist。可能是你的适配器中的问题。

答案 3 :(得分:0)

也许你没有关闭光标。我的代码建议:

public List<MenuData> getMenuItem(){
    List<MenuData> menuList = new ArrayList<MenuData>();
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.rawQuery ("SELECT * from " + TABLE_NAME_MENU, null);
    try { 

        if ( cursor.moveToFirst()) {
            do {
                MenuData menuData = new MenuData();
                menuData.setKEY_ITEM_NAME(cursor.getString(cursor.getColumnIndex(KEY_ITEM_NAME)));
                menuData.setKEY_ITEM_CATEGORY(cursor.getString(cursor.getColumnIndex(KEY_ITEM_CATEGORY)));
                menuData.setKEY_ITEM_CONTENTS(cursor.getString(cursor.getColumnIndex(KEY_ITEM_CONTENTS)));
                menuData.setKEY_ITEM_TYPE(cursor.getString(cursor.getColumnIndex(KEY_ITEM_TYPE)));
                menuData.setKEY_PRICE(cursor.getString(cursor.getColumnIndex(KEY_PRICE)));
                menuList.add(menuData);
            } while (cursor.moveToNext());
        }

    } finally {
        // close the cursor
        if(cursor != null) {
            cursor.close(); 
        }
    } catch(Exception e) {
        // handle exception
    }
    return menuList;
}