Я просматривал примеры в Интернете, но не смог найти ни одного примера того, как 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());
}