جست و جو در دیتابیس

پرسیده شده
فعالیت 1298 روز پیش
دیده شده 788 بار
0

سلام دوستان

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

و همینطور وقتی 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();
    }

 

فایل پیوست

Hamidreza Kermani
Hamidreza Kermani

22 مهر 99

1
حذف شده

سلام و احترام 

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

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

else {
                    adapterMainRecycler.replaceStudents(studentList);
                }

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

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

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

موفق باشید

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

22 مهر 99

0
حذف شده

سلام

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

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

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

فایل پیوست

Hamidreza Kermani

توسط

Hamidreza Kermani

22 مهر 99

حذف شده
منظور شما از آیتمهایی که باید برگردونه بر نمیگرداند چی هست؟ درمورد configurationchange مشکل به احتمال خیلی زیاد همان اداپتر خواهد بود . (اما بهر حال برنامه نویسی هست و اشتباه و باگ های متعدد)
پوریا شفیعی

22 مهر 99

حذف شده
اگه دقت کرده باشی وقتی دارم از دیتابیس query میگیرم مقداری که میگیرمو هم دارم تو firstName هم تو lastName جست جو میکنم... ایتم هایی رو داریم که یکیش مثلا Ali Asghari هست ... وقتی Ali رو سرچ میکنم اون ایتم نمیاد.. ولی وقتی تو دیتابیس فقط از firstName درواقع query میگیرم درست کار میکنه...
Hamidreza Kermani

22 مهر 99

حذف شده
خب میتونید در مدلتون یه fullname بسازید و همونجا مقدارشو با getter های firstname , last name مقدار دهی کنید (راهی که به ذهنم رسید صد البته راه بهتری هم وجود دارد)و با اون جستجو رو انجام بدید . اما در هر حال کد برای موضوع configuration باید با لایو دیتا قضیه رو هندل بفرمایید.
پوریا شفیعی

22 مهر 99

حذف شده
پوریا جان حل شد...اون configuration رو اکی کردم با livedata و در مورد جست و جو هم بگم راه حلتو استقاده کردم و کار کرد... فقط چیزی که ذهنو درگیر کرده اون query که گرفتم مشکل داشت یا نداشت؟؟چرا درست کار نمیکرد؟؟؟ به هر حال تشکر
Hamidreza Kermani

22 مهر 99

حذف شده
خوشحالم که حل شد . چون کد رو ندیدم به صورت کامل نمیتونم نظر قطعی بدم احتمالا مشکل از OR بوده توی کويری
پوریا شفیعی

23 مهر 99