【问题标题】:Sqlite NullPointerException on either first or last row第一行或最后一行的 Sqlite NullPointerException
【发布时间】:2013-03-25 22:25:03
【问题描述】:

我已经通过空指针和查询帖子搜索了高低,但仍然无法解决这个问题。我正在使用自定义适配器对 ListView 进行充气,然后使用 ItemLongClickListener 将其注册,从而引发上下文菜单。上下文菜单中填充了从数据库中检索到的数据,这些数据使 ListView 膨胀...同样的行数,显然...但是当我查询第一项(为 int id 传入的位置“0”)时,我得到一个例外。但是,如果我在它传入后将其增加一,我会在最后一行得到相同的异常。所有其他行都很好地显示了查询的数据。我可以包含更完整的代码,但我认为我在这里遗漏了一些更基本的东西......有什么想法吗?提前感谢,我的第一个问题——如果我的发布需要以不同的方式进行,请也告诉我!

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)

感谢观看!

【问题讨论】:

  • 如果 cursor 返回 0 列,您永远不会调用 moveToFirst,因此光标将位于 IllegalState 中。其次,你不要关闭光标,我推荐try{ //blablalbla}finally{cursor.close()}。最后,您有什么保证 id 存在于数据库中?
  • 如我所说,行是从表数据生成的;如果我有 3 行,位置 0、1 和 2,我想查询 1、2 和 3 的 id...我仍然不明白为什么查询 3 会引发异常。关闭光标(一个很好的建议)没有任何效果。

标签: android sqlite nullpointerexception cursor


【解决方案1】:

但是当我查询第一项(为 int id 传入的位置“0”)时,我得到了一个异常。

尝试查找 id 为 0 的行很可能会返回一个空游标,SQLite INTEGER PRIMARY KEY 应该始终大于零。与其传递position,不如尝试传递id,如果您的自定义适配器是CursorAdapter,那么onItemClick 中的id 参数就是当前行的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 行是什么?

【讨论】:

  • 按照建议重新排列 moveToFirst 并没有改变最后一行的异常......奇怪的是,第 310 行位于自定义适配器中,上下文菜单上没有调用它。 .我还是卡住了,抱歉:((如果我能弄清楚怎么做,我可以添加适配器代码......)是否有必要在 Android 中使用光标?
  • 谢谢,Sam...事实证明查询很好并返回了我的值,我正在对其中一个(空)返回值执行非法操作。您对第 310 行的评论让我对此进行了更深入的研究,所以我会给您投票。
猜你喜欢
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2012-02-16
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多