首页 > 解决方案 > ListView 仅显示来自数据库匹配条件集的 4 条记录中的 3 条

问题描述

我是一名 A Level 学生,目前正在通过我的 A Level 计算机科学控制评估。我在 Android Studio 中工作,使用 Java、XML 和 SQLite,这些我以前都没有使用过。我正在构建一个 Scout Manager 应用程序。

我目前正在显示事件详细信息,特别是受邀参加事件的每个 Scout 的名称和部分,这将显示在 ListView 中。唯一的问题是,虽然数据库中已邀请 4 名童军参加此活动,但仅显示了 3 名 - 或者,显示的童军人数太少。

应该注意的是,活动、邀请和球探有单独的表格。邀请表将正在参加的活动的 id 和正在参加的球探的 id 匹配在一起 - 因此,我找到了某个活动的所有邀请,然后是参加该活动的个人球探,然后再显示详细信息侦察。

这是用于从我的 databaseHandler 类中从数据库获取给定事件的邀请的代码:

public Cursor getEventInvites(int sessionid) {
    String[] columns={COLUMN_INID + " AS " + BaseColumns._ID, COLUMN_SEID, COLUMN_SCID};
    String selection=COLUMN_SEID + " =? ";
    String[] selectionArgs={String.valueOf(sessionid)};
    Cursor cursor=db.query(TABLE_INVITES, columns, selection, selectionArgs, null, null, null);
    return cursor;
}

下面是用于在 ListBox 中显示详细信息的代码:

ListView scoutslist = findViewById(R.id.listScouts);
scoutdetailslist=new ArrayList<String>();
scoutadapter=new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, scoutdetailslist);
//ArrayList<int>
Cursor invites;
invites=DatabaseHandler.getEventInvites(sessionid);
invites.moveToFirst();
try {
    while (invites.moveToNext()) {
        int ScoutID = invites.getInt(invites.getColumnIndex(DatabaseHandler.COLUMN_SCID));
        Cursor scout = DatabaseHandler.getScout(ScoutID);
        String forename = scout.getString(scout.getColumnIndex(DatabaseHandler.COLUMN_FNAME));
        String surname = scout.getString(scout.getColumnIndex(DatabaseHandler.COLUMN_LNAME));
        String section = scout.getString(scout.getColumnIndex(DatabaseHandler.COLUMN_SECTION));
        String ScoutBasicDetails = forename + " " + surname + ", " + section;
        scoutdetailslist.add(ScoutBasicDetails);
    }
} finally {
    invites.close();
}
scoutslist.setAdapter(scoutadapter);

这是用于从数据库中获取侦察兵详细信息的代码。

public Cursor getScout(int scoutid) {
    String[]columns={COLUMN_SCID, COLUMN_FNAME, COLUMN_LNAME, COLUMN_DOB, COLUMN_SECTION, COLUMN_SEX, COLUMN_ADD1, COLUMN_ADD2, COLUMN_CITY, COLUMN_POST, COLUMN_RELIGION, COLUMN_ENAME, COLUMN_EHOME, COLUMN_EMOB, COLUMN_EEMAIL, COLUMN_MED, COLUMN_ALL, COLUMN_TET, COLUMN_SWIM, COLUMN_SCHOOL, COLUMN_PHOTO, COLUMN_MOVE};
    String selection = COLUMN_SCID + " =? ";
    String[] selectionArgs={String.valueOf(scoutid)};
    Cursor cursor=db.query(TABLE_SCOUTS, columns, selection, selectionArgs, null, null, null);
    if (cursor!=null&&cursor.moveToFirst()) {
        cursor.moveToFirst();
    } else {
        cursor=null;
    }
    return cursor;
}

任何帮助将不胜感激 - 另外,我是新手,而且很累,所以如果我遗漏了重要细节或不清楚,请不要犹豫,发表评论并要求我修改问题。

标签: javaandroidsqlite

解决方案


您正在移动到第一个项目,然后立即移动到下一个项目(因此跳过第一个项目):

invites.moveToFirst();
try {
    while (invites.moveToNext()) {

moveToFirst()考虑一个只有在调用成功时才执行的 do while 循环。


推荐阅读