Android 如何从数据库中获取listView中所选项目的数据并在alertdialog上查看?

Android 如何从数据库中获取listView中所选项目的数据并在alertdialog上查看?,android,Android,我创建的列表视图有问题: 我有一个食品数据库,但如何从数据库中获取listView中所选项目的数据并在alertdialog上查看 我可以查看数据,但当我单击其中任何一个时,我的应用程序将停止工作 我的代码如下所示: public class MainActivity extends AppCompatActivity { ListView listView; EditText editText; private DatabaseHelperList dbHelper;

我创建的列表视图有问题:

我有一个食品数据库,但如何从数据库中获取listView中所选项目的数据并在alertdialog上查看

我可以查看数据,但当我单击其中任何一个时,我的应用程序将停止工作

我的代码如下所示:

public class MainActivity extends AppCompatActivity {
    ListView listView;
    EditText editText;
    private DatabaseHelperList dbHelper;
    Adapter adapter;
    ArrayList<Item> arrayList = new ArrayList<Item>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //loadDatabase
        dbHelper = new DatabaseHelperList(this);
        try {
            dbHelper.checkAndCopyDatabase();
            dbHelper.openDatabase();
        } catch (SQLException e) {

        }
        try {
            Cursor cursor = dbHelper.QueryData("select *from menulist");
            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    do {
                        Item item = new Item();
                        item.setId(cursor.getString(0));
                        item.setFood(cursor.getString(1));
                        item.setCalories(cursor.getString(2));
                        arrayList.add(item);
                    } while (cursor.moveToNext());
                }
            }
        } catch (SQLException e) {
        }
        adapter = new Adapter(this, R.layout.custom_list_item, arrayList);
        listView = (ListView) findViewById(R.id.list_item);


        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
            {
                Cursor res = dbHelper.getAllData("select " + position + " from menulist");
                StringBuffer buffer = new StringBuffer();
                while (res.moveToNext()) {
                    buffer.append("Weight: " + res.getString(1) + " kg \n");
                    buffer.append("BMI: " + res.getString(2) + "\n");
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setCancelable(true);
                builder.setTitle("Confirmation:");
                builder.setMessage(res.getInt(res.getColumnIndex("id")));
                builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Intent startNewActivity = new Intent(MainActivity.this, SQLiteDemoActivity.class);
                        startActivity(startNewActivity);
                    }
                }).setNegativeButton("NO", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                    }
                });
                builder.show();
            }
        }

        );

    }
}
我的第一个忠告是:

为数据库中的所有resquet创建一个类DAO。在这里,如果您添加多个呼叫,它将变得无法读取

第二:

你确定:

while (res.moveToNext()) {
     buffer.append("Weight: " + res.getString(1) + " kg \n");
     buffer.append("BMI: " + res.getString(2) + "\n");
}

体重是一根绳子,体重指数也是一根绳子

如果权重是int或double,我认为必须使用res.getInt(1)或res.getDouble(1)。检查真正的方法,我不记得你必须指定“列名”

编辑:我想我发现了问题:

while (res.moveToNext()) {
                buffer.append("Weight: " + res.getString(1) + " kg \n");
                buffer.append("BMI: " + res.getString(2) + "\n");
            }

            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setCancelable(true);
            builder.setTitle("Confirmation:");
            builder.setMessage(res.getInt(res.getColumnIndex("id")));
看最后一行。您希望得到某物的整数,但光标现在是之前请求的项目列表的末尾

你可以:


一个while循环,用于将所有元素放在StringBuffer上,当它完成时,您要求另一个时间访问不再存在的元素

答案在日志中。它说,
CursorIndexOutOfBoundsException:Index 5已请求,大小为5
at
com.example.hidir.mnutrihealth.MainActivity$1.onItemClick(MainActivity.java:76)

问题就在这里,

builder.setMessage(res.getInt(res.getColumnIndex("id")));

调用方法
res.getInt()
时,光标的大小为5(表示索引值从0到4),但它指向索引5。这就是为什么它会抛出
CursorIndexOutOfBoundsException

我已经提供了日志问题是当您使用res在while循环之外获取id时。为什么你会有while循环?警报对话框应该只显示一个项目,对吗?我已经更改了它,但我的应用程序仍然停止工作。是的,我不知道如何使它工作。你能在setMessage方法上打印参数的值吗?在日志或toastI对不起,你是什么意思?用你所做的更改更新问题made@MoLab您可以使用Android的类日志来显示一些信息。例如,您可以使用Log.e(“Debug”,“正确的值是:”+String.valueOf(您的int))。我认为更容易看到您数据的内容。之后,您可以从IDE在调试模式下启动应用程序,并及时查看变量的内容
builder.setMessage(res.getInt(res.getColumnIndex("id")));