游标只返回一个值,而不是所有值

时间:2014-02-14 02:48:23

标签: java android android-sqlite

我的Android应用程序遇到了问题。我想检索列的所有值,但我只获取其中一个值。我已经尝试了一切,但我仍然找不到解决方案。这是我的数据库中的代码:

 public Cursor returnAllColumns() {
    Cursor cursor = mDb.query(FTS_VIRTUAL_TABLE,
            new String[] {KEY_ROWID,
                    KEY_NAME,
            KEY_CUSTOMER, PROTEIN, TOTAL_CARB}
            , null, null, null, null, null);
if (cursor != null) {
        cursor.moveToNext();
}
    return cursor;
}

这是我在另一个类中的代码,它显示了包含所有值的toast。

mDbHelper = new DBAdapter(DatabaseFiller.this);
                    mDbHelper.open();
                    Cursor c = mDbHelper.returnAllColumns();

                    String protein = c.getString(c.getColumnIndexOrThrow("protein"));

                    Toast.makeText(getApplicationContext(), protein, Toast.LENGTH_SHORT).show();

我得到的只是Protein = 0。我应该得到的是0, 0, 0, 0, 0, 0,...。我不知道我在这里做错了什么。在我的ListView中,我做对了。它在那里工作得很好。这是我的ListView代码:

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // Get the cursor, positioned to the corresponding row in the result set
                cursor = (Cursor) mListView.getItemAtPosition(position);
                //mListView.setItemChecked(position, true);
                // Get the state's capital from this row in the database.
                String name = cursor.getString(cursor.getColumnIndexOrThrow("customer"));
                String caloriescursor = cursor.getString(cursor.getColumnIndexOrThrow("name"));
                String totalfat = cursor.getString(cursor.getColumnIndexOrThrow("address"));
                String satfatcursor = cursor.getString(cursor.getColumnIndexOrThrow("city"));
                String state = cursor.getString(cursor.getColumnIndexOrThrow("state"));
                String zipCode = cursor.getString(cursor.getColumnIndexOrThrow("zipCode"));

然后返回带有一堆值的Toast。关于这个问题的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果光标返回多行,则需要循环游标,并在循环中构建输出。

继续调用c.moveToNext(),直到它返回false。

答案 1 :(得分:0)

getAllColumns()中,您的查询语句是正确的。它实际上会获取所有列。后面的if语句只是将其指向第一个结果。然后在指向第一个结果时返回光标。您应该取出if语句,因为它没有做任何有用的事情。

当试图展示吐司时,你需要这样的东西:

Cursor c = mDbHelper.returnAllColumns();
ArrayList<String> protein = new ArrayList<>();
while (c.moveToNext()) {
    protein.add(c.getString(c.getColumnIndexOrThrow("protein")));
}
Toast.makeText(getApplicationContext(), TextUtils.join(", ", protein), Toast.LENGTH_SHORT).show();

答案 2 :(得分:0)

在我这样做之前我遇到了同样的问题:

if (!cursor.moveToFirst()) {
    Log.d(LOG_TAG, "=== cursor not moveToFirst() ===");

    return null;
}

Log.d(LOG_TAG, "=== reading cursor of getAll() ===");
Log.d(LOG_TAG, String.valueOf(cursor));

List<Trip> trips = new ArrayList<>();
while (!cursor.isAfterLast()) {
    trips.add(cursorToTrip(cursor));

    cursor.moveToNext();
}

cursor.moveToNext()永远不会检查第一个元素。所以我检查过的课程不在最后一个,然后我添加了对象并移动到下一个。

就是这样! :)

相关问题