1

nullポインターとクエリの投稿を検索しましたが、それでも解決できません。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)

ご覧いただきありがとうございます!

4

1 に答える 1

1

しかし、最初の項目(int idに渡された位置「0」)を照会すると、例外が発生します。

IDが0の行を見つけようとすると、ほとんどの場合、空のカーソルが返されます。SQLiteINTEGER PRIMARY KEYは常にゼロより大きくなければなりません。パスするのではなく、パスpositionしてみてidください。カスタムアダプタがCursorAdapterの場合、のidパラメータonItemClickは現在の行のIDです。


存在しない行からデータを読み取ることができないため、このコードはカーソルが空の場合に例外をスローします。

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とは何ですか?

于 2013-03-25T22:41:06.193 に答える