تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ Hamidreza Kermani
جست و جو در دیتابیس
پوریا شفیعی حل شده توسط پوریا شفیعی

سلام دوستان

من قابلیت جست جو رو ایجاد کردم ولی درست کار نمیکنه...در واقع وقتی چیزی تو ادیت تکست وارد میکنید اون آیتم هایی که باید برگردونه رو نمیکنه...

و همینطور وقتی change configuration اتفاق میوفته دیتا فیلتر شده از بین میره..

کلاس ویو مدل از ViewModel اکستند هم کرده...

تو کلاس MainActivity هم به همون صورت که اقای شاهینی گفتند instance گرفتم

 

 

به این صورت از دیتابیس query میگیرم

StudentDao.class

@Query("SELECT * FROM students WHERE firstName OR lastName LIKE '%' || :query || '%'")
    LiveData<List<Student>> getStudentFiltered(String query);

 

StudentRepository.class

public LiveData<List<Student>> getFilteredStudents(String q){
        return studentsDao.getStudentFiltered(q);
    }

 

 

MainViewModel.class

 public LiveData<List<Student>> getStudentsFiltered(String a){
        return repository.getFilteredStudents(a);
    }

 

 

MainActivity.class

EditText editText = findViewById(R.id.search_box_main);
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void onTextChanged(CharSequence editable, int i, int i1, int i2) {
            }
            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() > 0) {
                    viewModel.getStudentsFiltered(editable.toString()).observe(MainActivity.this, students -> {
                        adapterMainRecycler.replaceStudents(students);
                    });
                } else {
                    adapterMainRecycler.replaceStudents(studentList);
                }
            }
        });

 

مقدار studentList  از اول که خواستم آیتم‌ها رو بگیرم داخل یه متغیر ریختم و دیگه دوباره observe نکردم برای دریافت کل آیتم ها...

 

کلاس اداپتر هم به این صورته:

AdapterMainRecycler.class

public void replaceStudents(List<Student> students) {
        this.studentList=students;
        notifyDataSetChanged();
    }

 

سلام و احترام 

برای کار با سرور عموما به ما یک Api برای |Search میدهند که این قضیه رو به راحتی بتوانیم هندل کنیم.

اما اگر هدف شما صرفا تمرین هست مشکل کد شما من فکر میکنم خط زیر هست 

else {
                    adapterMainRecycler.replaceStudents(studentList);
                }

چرا که شما امدید و از آداپتر استفاده کردید که وقتی configuration change تغییر میکند عملا adapter ما new شده و تغییرات از بین میروند

 در صورتی که نباید چنین صورتی باشد چون لایو دیتا از لیست تغییرات آگاه هست باید دیتا‌های ذخیره شده را صرفا در اکتیویتی یا فرگمنتتان observe کنید .

یه نکته اضافه‌تر هم خدمتتون عرض کنم این هست که سعی کنید از viewBinding استفاده کنید و از findView استفاده نکنید

موفق باشید

بهترین پاسخ
پوریا شفیعی ۲۲ مهر ۱۳۹۹، ۱۸:۵۹

سلام

اون رو هم تست کردم... درواقع دوباره لیست رو observe کردم...

فقط تمرینه یه جورایی...

ولی همین طور که گفتم search رو به درستی انجام نمیده...آیتم‌های که باید برگردونه رو بر نمیگردونه...اینش خیلی جالبه

Hamidreza Kermani ۲۲ مهر ۱۳۹۹، ۱۹:۰۳