Search code examples
android-studioandroid-room

Android Studio: Room Database without adapter or recycler view


Can I get data and insert data to database without using adapter or recycler view? This is my code.

package com.example.personalapp;

public class PersonalFragment extends Fragment {

  private PersonalViewModel personalVM;
  private TextView tvFullName, tvIdCard, tvPhoneNumber;

  public PersonalFragment(){
    // require a empty public constructor
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    return inflater.inflate(R.layout.fragment_personal, container, false);
  }

  @Override
  public void onViewCreated(@NonNull View view, @NonNull Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    tvFullName = view.findViewById(R.id.tvFullName);
    tvIdCard = view.findViewById(R.id.tvIdCard);
    tvPhoneNumber = view.findViewById(R.id.tvPhoneNumber);

    personalVM = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication())).get(PersonalViewModel.class);
    PersonalEntity pe = new PersonalEntity(0, "Testing User", "1234567891011", "08215326211");
    personalVM.insertUserData(pe);

    personalVM.getUserData().observe(getViewLifecycleOwner(), new Observer<PersonalEntity>() {
      @Override
      public void onChanged(PersonalEntity personal) {
        if(personal != null) {
          tvFullName.setText(personal.getFull_name());
          tvIdCard.setText(personal.getId_card());
          tvPhoneNumber.setText(personal.getPhone_number());
        } else {
          tvFullName.setText("?");
          tvIdCard.setText("?");
          tvPhoneNumber.setText("?");
        }
      }
    });
  }
}

But as soon as I run the application, I can't insert the data and display it on my app. But on the other page, I've display my database with adapter and recycler view and it's working fine.


Solution

  • I'm assuming that the personalVM.insertUserData(pe); is working since you said that you can see the new data on another page with recyclerview displaying it. Try calling the observe code first before inserting the new data. So it should look something like this:

      @Override
      public void onViewCreated(@NonNull View view, @NonNull Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        tvFullName = view.findViewById(R.id.tvFullName);
        tvIdCard = view.findViewById(R.id.tvIdCard);
        tvPhoneNumber = view.findViewById(R.id.tvPhoneNumber);
    
        personalVM = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication())).get(PersonalViewModel.class);
       
        // Write this code first
        personalVM.getUserData().observe(getViewLifecycleOwner(), new Observer<PersonalEntity>() {
          @Override
          public void onChanged(PersonalEntity personal) {
            if(personal != null) {
              tvFullName.setText(personal.getFull_name());
              tvIdCard.setText(personal.getId_card());
              tvPhoneNumber.setText(personal.getPhone_number());
            } else {
              tvFullName.setText("?");
              tvIdCard.setText("?");
              tvPhoneNumber.setText("?");
            }
          }
        });
    
        // Then insert the new data
        PersonalEntity pe = new PersonalEntity(0, "Testing User", "1234567891011", "08215326211");
        personalVM.insertUserData(pe);
      }
    

    I believe that you have to set the observer first before inserting new data. Hope this helps.