ListView отображает только 3 из 4 записей из набора критериев соответствия базы данных

#java #android #sqlite

#java #Android #sqlite

Вопрос:

В настоящее время я студент уровня A, проходящий контрольную оценку по информатике уровня A. Я работаю в Android Studio, используя Java, XML и SQLite, ни один из которых я раньше не использовал. Я создаю приложение Scout Manager.

В настоящее время я работаю над отображением сведений о событии, в частности имен и разделов каждого разведчика, который был приглашен на мероприятие, и это должно отображаться в ListView. Единственная проблема в том, что, хотя на это событие в базе данных были приглашены 4 разведчика, отображаются только 3 — или отображается слишком мало разведчиков.

Следует отметить, что существуют отдельные таблицы для событий, приглашений и разведчиков. Таблица приглашений сопоставляет идентификатор посещаемого события и идентификатор скаута, который его посещает, поэтому я нахожу все приглашения на определенное событие, а затем отдельных скаутов, посещающих мероприятие, перед отображением сведений о скауте.

Вот код, используемый для получения приглашений для данного события из базы данных, из моего класса 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!=nullamp;amp;cursor.moveToFirst()) {
        cursor.moveToFirst();
    } else {
        cursor=null;
    }
    return cursor;
}
  

Любая помощь была бы оценена — кроме того, я новичок в этом и довольно устал, поэтому, если я упустил важные детали или был неясен, пожалуйста, не стесняйтесь оставлять комментарий и просить меня изменить вопрос.

Ответ №1:

Вы переходите к первому элементу, а затем сразу переходите к следующему элементу (таким образом, пропуская первый элемент):

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

Рассмотрим цикл do while, который выполняется только в том случае, если moveToFirst() вызов выполнен успешно.