Как извлекать пользователей из списка живых данных для отображения в счетчике с использованием базы данных Room

#java #android #database #android-room

#java #Android #База данных #android-room

Вопрос:

Я следовал нескольким руководствам, совсем недавно это из CodeLabs, чтобы попытаться создать базу данных Room для моего приложения. Во всех руководствах, которые я использовал, используется представление Recycler. Я пытаюсь выяснить, как использовать эти данные и реализовать их в компонентах другого типа, но пока для отображения пользователей используется счетчик.

У меня есть моя сущность, dao, база данных, репозиторий и модель представления, и я думаю, что все работает правильно.

Мой адаптер отличается от руководства, поскольку они используют код, предназначенный для просмотра recyler. Где, поскольку я хочу, чтобы мои данные отображались в счетчике.

 class UserListAdapter {

private List<Users> mUser = Collections.emptyList(); // Cached copy of words


void setUser(List<Users> user){
    mUser = user;
}

// getItemCount() is called many times, and when it is first called,
// mWords has not been updated (means initially, it's null, and we can't return null).
public int getItemCount() {
    if (mUser != null)
        return mUser.size();
    else return 0;
}}
 

Где, как здесь, находится адаптер CodeLabs.Я просто удалил все, что связано с представлением recyler, и использовал оставшийся код для своего адаптера.

У меня есть значения по умолчанию «Hello», «World», предварительно заполняющие базу данных во время сборки в классе database, вот этот метод:

 private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {

    private final UsersDao mDao;

    PopulateDbAsync(AppDatabase db) {
        mDao = db.usersDao();
    }

    @Override
    protected Void doInBackground(final Void... params) {
        mDao.deleteAll();
        Users user = new Users("Hello");
        mDao.insertNewUser(user);
        user = new Users("World");
        mDao.insertNewUser(user);
        return null;
    }
}
}   
 

У меня есть метод, который вставляет данные в счетчик:

 private void createSpinners(ArrayList<String> listToUse) {
    ArrayAdapter<String> adp1 = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, listToUse);
    spin_PlayerSelection.setAdapter(adp1);

}
 

В блоке кода onCreate я хочу получить список пользователей и передать его вышеуказанному методу.

 final UserListAdapter adapter = new UserListAdapter();
    mUsersViewModel = ViewModelProviders.of(this).get(UsersViewModel.class);

    mUsersViewModel.getAllUsers().observe(this, new Observer<List<Users>>() {
        @Override
        public void onChanged(@Nullable final List<Users> user) {
            // Update the cached copy of the words in the adapter.
            // Update scroll view here
            adapter.setUser(user);
            createSpinners(mUsersViewModel.getAllUsers());
        }
    });
 

Как бы то ни было, сейчас я получаю сообщение об ошибке:

ошибка

Где я ошибаюсь?

Обновлено с учетом ответа @JohnJoe:

Я пробовал ваш способ, но у getAllUsers нет.Метод Size, потому что это LiveData (я думаю). Но у меня есть метод getItemCount в моем UserListAdapter, поэтому я использовал это, а затем использовал метод get name в классе Users, который содержит объект или таблицу, чтобы оставить код таким:

 mUsersViewModel.getAllUsers().observe(this, new Observer<List<Users>>() {
        @Override
        public void onChanged(@Nullable final List<Users> user) {
            // Update the cached copy of the words in the adapter.
            // Update scroll view here
            adapter.setUser(user);
            for (int i = 0; i < adapter.getItemCount(); i  ) {
                playerNames.add(String.valueOf(user.get(i)));
            }
            createSpinners(sortListAlphabetically(playerNames));
        }
    });
 

Это возвращает значения, но не имена самих себя, как вы можете видеть на этом изображении, но это прогресс.

введите описание изображения здесь

Комментарии:

1. mUsersViewModel.getAllUsers вернется ArrayList ?

2. @JohnJoe Он возвращает LiveData<List<Users>>

3. вы получаете значение списка. Вы должны извлекать переменные внутри пользовательского класса. Пример: user.get(i).name где name находится внутри класса User.

Ответ №1:

Вам нужно создать другой ArrayList , используемый для хранения данных mUsersViewModel.getAllUsers() .

Для примера:

 for(i<0;i<mUsersViewModel.getAllUsers().size; i  ){
     list.add(user.xxx) // get user info here
}
 

Тогда только вы можете передать список в createSpinner function.

 createSpinners(list);
 

Основываясь на вашем отредактированном сообщении, вы получаете значение списка. Вы должны извлекать переменные внутри пользовательского класса. Пример: user.get(i).name где имя находится внутри User класса.

Комментарии:

1. Я получил некоторые данные обратно, но немного по-другому, я обновлю вопрос, чтобы показать вам

2. Обновлено. @JohnJoe

3. ДжонДжо, это работает с момента вашего последнего комментария к вопросу! Я предлагаю вам обновить свой ответ, спасибо!