Реализация ViewModel & Repository для пользовательских запросов - PullRequest
0 голосов
/ 28 марта 2019

Я просматривал примеры в Интернете, но не смог найти ни одного примера того, как ViewModel и Repository будут реализованы для этого запроса.

    @Query("SELECT * FROM user_table WHERE id = :userId")
    LiveData<User> getUser(int userId);

Моя попытка этого выглядела примерно так

     public class UserRepository {
        private UserDao userDao;
        private LiveData<List<User>> allUsers;
        private LiveData<User> user;
        private int userId;

        public UserRepository(Application application) {
            UserDatabase database = UserDatabase.getInstance(application);
            userDao = database.userDao();
            allUsers = userDao.getAllUsers();
            user = userDao.getUserById(userId);

        }
        public LiveData<List<User>> getAllUsers() {
            return allUsers;
        }

        public LiveData<User> getUser(int userId){
            return user;
        }
    }
    public class UserViewModel extends AndroidViewModel {

        private UserRepository userRepository;
        private LiveData<List<User>> allUsers;
        private LiveData<User> user;
        private int userId;

        public UserViewModel(@NonNull Application application) {
            super(application);
            userRepository = new UserRepository(application);
            allUsers = ((UserRepository)userRepository).getAllUsers();
            user = ((UserRepository)userRepository).getUser(userId);
        }

        public LiveData<List<User>> getAllUsers() {
            return allUsers;
        }

        public LiveData<User> getUser(int userId){
            return user;
        }
    }

Это привело к нулевому исключению указателя после попытки установить данные пользователя, вошедшего в систему, в заголовок навигации.

    View hView =  navigationView.inflateHeaderView(R.layout.nav_header_main);
    navHeaderUsername = hView.findViewById(R.id.nav_header_username);

    Intent intent = getIntent();
      if (intent.hasExtra(LoginActivity.EXTRA_ID)){

            int id = intent.getIntExtra(LoginActivity.EXTRA_ID, -1);
            if (id == -1) {
                Toast.makeText(this, "Login Error!!", Toast.LENGTH_SHORT).show();
                return;
            }


            navHeaderUsername.setText(Objects.requireNonNull(userViewModel.getUser(id).getValue()).getName());
       }

1 Ответ

1 голос
/ 28 марта 2019

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

Как только вы получите объект LiveData, вызвав это:

LiveData<User> user = userViewModel.getUser(id);

Затем вам нужно сделать следующее:

user.observe(this, new Observer<User>() {
        @Override
        public void onChanged(@Nullable User u) {
            // Do your stuff here
        }
    });

Метод onChanged(..) вызывается, когда доступны данные для ваших вещей.

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...