Фильтр на основе пользовательского ввода - LiveData, Recycler, RoomView - PullRequest
0 голосов
/ 28 мая 2020

У меня есть база данных SQLite для моего Android приложения. В базе данных есть таблица для свойств и еще одна таблица для ремонта для каждого свойства.

Ремонт стола :

@Entity(tableName = "repairs",
        indices = {@Index(value = "repairID", unique = true), @Index("repairPropID")})

public class MYRepairs
{
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "repid")
    public int id;

    @ColumnInfo(name = "repairID")
    @NonNull
    public String repairID;

    @ColumnInfo(name = "repairPropID")
    public int repairPropID;
}

...

а затем RepairsDao. java

 @Dao
    public interface MyRepairsDao
    {
        @Query("SELECT * FROM repairs WHERE repid = :repid LIMIT 1")
        MYRepairs findRepairById(String repid);


        @Query("SELECT * FROM repairs WHERE repairPropID = :repairPropID")
        MYRepairs findRepairByPropID(int repairPropID);


        @Query("SELECT * FROM repairs ORDER BY repairPropID ASC")
        LiveData<List<MYRepairs>> getAllRepairs();

 @Query("SELECT * FROM repairs WHERE repairPropID = :repairPropID")
    LiveData<List<MYRepairs>> getPropertyRepairs(int repairPropID);

    }

В ViewModel :

   public class repairViewModel extends AndroidViewModel
    {
        private MyRepairsDao myRepairDao;
        private LiveData<List<MYRepairs>> repairLiveData;
        private LiveData<List<MYRepairs>> repairPropertyLiveData;
        private LiveData<String> filterLiveData = new MutableLiveData<String>();

        public repairViewModel(@NonNull Application application)
        {
            super(application);
            myRepairDao = DogwoodDatabase.getDatabase(application).repairDao();
            repairLiveData = myRepairDao.getAllRepairs();
            repairPropertyLiveData = myRepairDao.getPropertyRepairs(propertyID);
        }

        public LiveData<List<MYRepairs>> getAllRepairs()
        {
            return repairLiveData;
        }

        public LiveData<List<MYRepairs>> getPropertyRepairs(int propertyID) 
        { 
            return repairPropertyLiveData; 
        }

И в RecyclerView.Adapter :

public class repairListAdapter extends RecyclerView.Adapter<repairListAdapter.RepairViewHolder>
{
@NonNull
        @Override
        public repairListAdapter.RepairViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
        {
            final View itemView = layoutInflater.inflate(R.layout.repaircontent, parent, false);
            return new repairListAdapter.RepairViewHolder(itemView);
        }

В repairFragment - мы хотим просмотреть только ремонт для выбранного пользователем свойства . Код собственности propertyID получен repairFragement . Это известно initData ()

   public class repairFragment extends Fragment
    {

        private repairListAdapter repairListAdapter;
        private repairViewModel repairViewModel;

        public void onCreate(@Nullable Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            propertyID = getArguments().getString("ARG_PROPNUM_ID");
            propNumID = Integer.parseInt(propertyID);
            initData();
        }



     private void initData()
        {
            Log.e ("INIT", "ID is " + propertyID);

            repairViewModel = new 
                   ViewModelProvider(this).get(repairViewModel.class);


repairViewModel.getPropertyRepairs(propertyID).observe(this, new Observer<List<MYRepairs>>()
            {
                @Override
                public void onChanged(@Nullable List<MYRepairs> MYRepairs)
                {
                    repairListAdapter.setMYRepairList(MYRepairs);
                }
            });

        }

Это не возвращает НИКАКИХ ЗАПИСЕЙ. В идеальном мире в моей собственности не было бы ремонта, но я не живу в этом мире!

Я просмотрел эту доску в поисках помощи по фильтрации.

Можете ли вы помочь мне с тем, как отфильтровать только для ремонта, выбранного пользователем свойства (propertyID).

Спасибо, Рэйчел

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

То, что вы хотели сделать, это следующее:

public LiveData<List<MYRepairs>> getPropertyRepairs() { 
    return repairPropertyLiveData; 
}

И

private MutableLiveData<String> selectedPropertyId = new MutableLiveData<>();

private final repairPropertyLiveData = Transformations.switchMap(selectedPropertyId, (id) -> {
    return myRepairDao.getPropertyRepairs(id);
});

public void updateSelectedProperty(String propertyId) {
    selectedPropertyId.setValue(propertyId);
}

Таким образом вы не получите новые подписки, которые не были должным образом признаны недействительными в случае позже вы должны были выбрать другой идентификатор собственности.

0 голосов
/ 29 мая 2020

Боже мой! Я понял.

В ремонтеViewModel:

public LiveData<List<MYRepairs>> getPropertyRepairs(int propertyID)
    {

        repairPropertyLiveData = myRepairDao.getPropertyRepairs(propertyID);
        return repairPropertyLiveData;
    }
...