Как объединить данные из двух таблиц базы данных в один listView

Я не совсем понимаю, как объединить два отдельных запроса к базе данных в один listView.

В настоящее время мой listView заполняется следующим адаптером, который запрашивает таблицу поврежденных компонентов в моей базе данных и предоставляет список поврежденных компонентов для определенного местоположения:

private class MyListAdapter extends ResourceCursorAdapter { 

    // In your ListActivity class, create a new inner class that extends ResourceCursorAdapter. 
    //This inner class is the custom CursorAdapter we will use to manage how data is bound to a list item:

    public MyListAdapter(Context context, Cursor cursor) { 
        super(context, R.layout.row_location, cursor);
    } 

    @Override
    public void bindView(View view, Context context, Cursor cursor) { 
        TextView text_first_line = (TextView) view.findViewById(R.id.location_row_item_main_text);
        TextView text_second_line = (TextView) view.findViewById(R.id.location_row_item_secondary_text);
        ImageView flagIcon = (ImageView) view.findViewById(R.id.flagIcon);

        String row_text_component = cursor.getString(cursor.getColumnIndex(RMDbAdapter.COMPONENT));
        String row_text_position = ", Position " + cursor.getString(cursor.getColumnIndex(RMDbAdapter.POSITION));
        if(row_text_position.equals(", Position Not Applicable")){
            row_text_position = "";
        }
        String row_text_action = " - " + cursor.getString(cursor.getColumnIndex(RMDbAdapter.ACTION_REQUIRED));

        text_first_line.setText(row_text_component + row_text_position + row_text_action);
        text_second_line.setText("Dexion Speedlock, S Duty, 3000mm");

        String risk = cursor.getString(cursor.getColumnIndex(RMDbAdapter.RISK));
        if (risk.equals("Red Risk")){
            flagIcon.setImageResource(R.drawable.red_flag);
        }
        else if (risk.equals("Green Risk")){
            flagIcon.setImageResource(R.drawable.green_flag);
        }
        else if (risk.equals("No Risk")){
            flagIcon.setImageResource(R.drawable.note);
        }

    }
}

Это срабатывает, когда я вызываю следующее при запуске действия:

private void setAdapter(){

    // Get a Cursor for the list items

    Cursor listComponentCursor = rmDbHelper.fetchDamagedComponentsForLocation(locationId);
    componentCursorSize = listComponentCursor.getCount();
    startManagingCursor(listComponentCursor); 
    // set the custom list adapter     
    setListAdapter(new MyListAdapter(this, listComponentCursor));

}

Поэтому я также хотел бы создать второй запрос в отдельной таблице (на этот раз таблица с ошибками) и добавить его в listView под списком поврежденных компонентов.

Чтение этого списка из нескольких таблиц? Я считаю, что я должен использовать курсор объединения или слияния. Однако из того, что я исследовал, я до сих пор не знаю, как интегрировать любую концепцию в мой код.

Кто-нибудь может указать мне правильное направление, пожалуйста?

1 ответ

Решение

Хотя ты не показываешь это, я собираюсь предположить, что ты отверг newView метод адаптера курсора. MergeCursor просто помещает результаты одного запроса поверх следующего. CursorJoiner в значительной степени поместит результаты рядом. Похоже, вы хотите MergeCursor.

Если вы хотите просто объединить результаты второго запроса с первым, выполните оба запроса и создайте MergeCursor. Если вам нужны разные макеты или имена столбцов, вам нужно переопределить getItemViewType метод в адаптере. Тогда в вашем newView Метод, вы можете раздувать различные виды в зависимости от типа. В bindView вам нужно проверить тип и применить правильные значения к правильным представлениям.

Пара случайных советов для вашего кода:

1) использовать шаблон ViewHolder, это намного быстрее.

2) это всегда лучше делать "literal string".equals(variable) вместо variable.equals("literal string") потому что литеральная строка не может выдать исключение NullPointerException

Другие вопросы по тегам