I encountered a problem while learning the room database, I need help I have created the room database well and write the employees name in recyclerView There is a query that I want to implement, and it collects all employees' salaries and displays them in recyclerView
I will shorten the codes
The Problem
Attempt to invoke virtual method 'void com.app.roomdatabase.database.MyViewModel.getSalariesSum(long, com.app.roomdatabase.database.GetSalarySumListener)' on a null object reference
at com.app.roomdatabase.Adapters.EmployeeSalaryAdapter$viewHolder.bind(EmployeeSalaryAdapter.java:68)
at com.app.roomdatabase.Adapters.EmployeeSalaryAdapter.onBindViewHolder(EmployeeSalaryAdapter.java:49)
at com.app.roomdatabase.Adapters.EmployeeSalaryAdapter.onBindViewHolder(EmployeeSalaryAdapter.java:19)
The query that i used for retrieve salaries
@Query("select sum(amount) from salary where empId=:emp_id")
double getSalariesSum(long emp_id);
Repository
public void getSalariesSum(long emp_id, GetSalarySumListener listener ) {
MyRoomDatabase.databaseWriteExecuter.execute(new Runnable() {
@Override
public void run() {
double value = salaryDAO.getSalariesSum(emp_id);
listener.onValueSubmit(value);
}
});
**GetSalarySumListener **
public interface GetSalarySumListener {
void onValueSubmit(double value);}
ViewModel
public void getSalariesSum(long emp_id, GetSalarySumListener listener ){
repository.getSalariesSum(emp_id,listener);
}
Adapter
public class EmployeeSalaryAdapter extends RecyclerView.Adapter<EmployeeSalaryAdapter.viewHolder> {
List <Employee> employees;
private MyViewModel mvm;
public EmployeeSalaryAdapter(List <Employee> employees, MyViewModel mvm) {
this.employees = employees;
this.mvm = mvm;
}
public List <Employee> getEmployees() {
return employees;
}
public void setEmployees(List <Employee> employees) {
this.employees = employees;
notifyDataSetChanged();
}
@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new viewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.emp_sal_item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull EmployeeSalaryAdapter.viewHolder holder, int position) {
Employee employee = employees.get(position);
holder.bind(employee,mvm);
}
@Override
public int getItemCount() {
return employees.size();
}
public class viewHolder extends RecyclerView.ViewHolder {
EmpSalItemBinding binding;
Employee employee;
public viewHolder(@NonNull View itemView) {
super(itemView);
binding= EmpSalItemBinding.bind(itemView);
}
public void bind(Employee employee, MyViewModel mvm) {
this.employee = employee;
binding.empNameTv.setText(employee.getName());
mvm.getSalariesSum(employee.getId(), new GetSalarySumListener() {
@Override
public void onValueSubmit(double value) {
binding.empSalaryTv.setText(String.valueOf(value));
}
});
}
}