【问题标题】:Error with SQLite cursorSQLite 游标出错
【发布时间】:2014-03-11 09:37:16
【问题描述】:

我正在尝试从 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 并且它在表格中具有相同的行数。所以列表视图具有所有相同的项目。

【问题讨论】:

  • 我没有得到结果。

标签: android sqlite cursor


【解决方案1】:

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

还有,改变

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

if (cursor.moveToFirst()) {

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

【讨论】:

  • @Rashid 你为什么不使用 SimpleCursorAdapter ?
  • @laalto 没有变化。得到所有相同的项目,它们是表中最后一行的元素
  • @pskink 我正在使用 BaseAdapter。
  • @Rashid 所以使用 SimpleCursorAdapter,为什么要重新发明轮子?
  • @pskink 除了在 ListView 中显示之外,我还需要执行更多操作。
【解决方案2】:

请用这个结构更正你的代码

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

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

【讨论】:

  • 所有数据都附加到一个 MenuData 对象,每个 MenuData 对象都添加到 ArrayList 以传递给 List View。
【解决方案3】:

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

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

【讨论】:

  • 这也行不通。我得到了包含表中最后一行元素的列表。
  • 可能问题出在其他地方,尝试添加一些从光标读取数据的 Log.i,当您显示菜单项时可能出现问题
  • 我的列表中的所有元素都与我检查的相同。
  • 我编写了示例应用程序,使用以下代码可以正常工作:drive.google.com/file/d/0BwoxRKemDO1EZXBqUFQ3cjNwdTQ/…
【解决方案4】:

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

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

...您确定此代码中存在问题吗? 检查您的数据列表。可能是您的适配器有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多