第一行或最后一行的Sqlite NullPointerException

时间:2013-03-25 22:25:04

标签: android sqlite nullpointerexception cursor

我通过空指针和查询帖子搜索了高低,但仍无法解决此问题。我正在使用自定义适配器对ListView进行充气,然后使用ItemLongClickListener注册它,这会引发上下文菜单。上下文菜单中填充了从数据库中检索到的数据,这些数据夸大了ListView ...相同的行数,显然......但是当我查询第一个项目(为int id传入位置'0')时,我得到一个例外。但是如果我在传入后将它递增1,我会在最后一行得到相同的异常。所有其他行显示查询数据就好了。我可以包含更完整的代码,但我想我在这里缺少一些更基本的东西......任何想法?提前致谢,我的第一个问题 - 如果我的帖子需要以不同的方式完成,请让我知道!

listview.setAdapter(new MyCustomAdapter(text, image));
listview.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View strings,
                int position, long id) {
            // showToastMessage("" + position);
            showDialogOnLongClick(position);
            return true;
        }
});

对话框构建器,它调用数据库函数:

private void showDialogOnLongClick(int position) {
    Builder alert = new AlertDialog.Builder(this);
    // AlertDialog alert = new AlertDialog.Builder(this).create();
    ArrayList mSelectedItems = new ArrayList();

    ArrayList<String> listInfo = getListInfo(position);

   ...

}

并且,数据库的实际查询:

    // Getting single list item data
public ArrayList<String> getListInfo(int id) {
    DatabaseHelper helper = new DatabaseHelper(this);
    database = helper.getReadableDatabase();
    //to increment, or not to increment?
    id++;
    // Cursor cursor =
    // database.rawQuery("SELECT * FROM list_data WHERE _id ='"+ id +"'",
    // null);
    Cursor cursor = database.query("list_data", new String[] { "listTitle",
            "listContent", "dateCreated", "dateModified" }, "_id = " +     id
            + "", null, null, null, null);

    if (cursor != null && (cursor.getCount() > 0))
        cursor.moveToFirst();

    ArrayList<String> result = new ArrayList<String>();
    result.add(cursor.getString(cursor.getColumnIndex("listTitle")));
    result.add(cursor.getString(cursor.getColumnIndex("listContent")));
    result.add(cursor.getString(cursor.getColumnIndex("dateCreated")));
    result.add(cursor.getString(cursor.getColumnIndex("dateModified")));

    return result;
}

logCat:

03-25 15:13:20.113: E/AndroidRuntime(12639): FATAL EXCEPTION: main
03-25 15:13:20.113: E/AndroidRuntime(12639): java.lang.NullPointerException
03-25 15:13:20.113: E/AndroidRuntime(12639):    at com.baked.listanywhere.ActivityMain.showDialogOnLongClick(ActivityMain.java:310)

谢谢你看看!

1 个答案:

答案 0 :(得分:1)

  

但是当我查询第一个项目(为int id传入位置'0')时,我得到一个例外。

尝试查找id为0的行很可能会返回一个空的Cursor,SQLite INTEGER PRIMARY KEY应始终大于零。如果您的自定义适配器是CursorAdapter,那么尝试传递position而不是传递id,而id中的onItemClick参数是当前行的ID。


当Cursor为空时,此代码将抛出异常,因为您无法从不存在的行读取数据:

if (cursor != null && (cursor.getCount() > 0))
    cursor.moveToFirst();

...
result.add(cursor.getString(cursor.getColumnIndex("listTitle"))); // Exception!

更好的方法是检查moveToFirst()

的结果
if(cursor != null && cursor.moveToFirst()) {
    ...
    result.add(cursor.getString(cursor.getColumnIndex("listTitle")));
}

至于:

java.lang.NullPointerException
    at com.baked.listanywhere.ActivityMain.showDialogOnLongClick(ActivityMain.java:310)

MainActivity中的第310行是什么?