العودة إلى موقع برمج

البحث فى قاعدة البيانات

#1

كيف اقوم بالبحث داخل عدة جدوال موجودة بقاعدة البيانات
انا استطيع البحث داخل كل جدول على حدة عن طريق هذا الكود مع تغيير اسم الجدول لكل جدول

" SELECT * FROM " + DatabaseHelper.PRODUCT_TB_INTERCHEMIE_NAME +" WHERE " +  DatabaseHelper.CLN_PRODUCTS + " LIKE ?",new String[]{modelSearch+"%"} );

ولكن بحثت كثيرا ولا اعلم كود للبحث داخل جميع الجداول

#2

يمكنك حفظ اسماء الجداول ضمن مصفوفة مثلا tables ثم من خلال جملة دوران يمكنك ان تعيدي تنفيذ سطر الكود المذكور

  for x in tables:

وفي كل مرة تنفذ فيها جملة الدوران (ستنفذ بعدد العناصر الموجودة ضمن المصفوفة بشكل تلقائي) يمكنك تمرير اسم كل جدول على حدى (x ستحوي اسم الجدول) ضمن الامر السابق:

1 Like
#3

شكرا جزيلا على الرد
ولكن معذرة برجاء توضيح جملة الدوران

دالة البحث التى استخدمها سابقا كانت كالآتى

 // دالة البحث
public ArrayList<Product> searchInterchemie(String modelSearch){
    ArrayList<Product> cars = new ArrayList<>();
    Cursor cursor =  database.rawQuery(" SELECT * FROM " + DatabaseHelper.PRODUCT_TB_INTERCHEMIE_NAME +" WHERE " +  CLN_PRODUCTS + " LIKE ?",new String[]{modelSearch+"%"} );

    // كود التعامل مع الكرسر وتحويله لمصفوفة من النوع CAR
    // فحص هل الكيرسور يحتوى على بيانات ام لا
    if(cursor != null && cursor.moveToFirst()){

        do {
            int id = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.CLN_ID));
            String product = cursor.getString(cursor.getColumnIndexOrThrow(CLN_PRODUCTS));

            Product c = new Product(id,product);
            cars.add(c);
        }
        while (cursor.moveToNext());
        cursor.close();
    }

    return  cars;
}

ثم قمت باضافة جملة الدوران وعدلتها كالىتى

 // دالة البحث
public ArrayList<Product> searchInterchemie(String modelSearch){
    ArrayList<Product> cars = new ArrayList<>();
    String [] tables = {"PRODUCT_TB_NAME","PRODUCT_TB_INVESA_NAME","PRODUCT_TB_INTERCHEMIE_NAME","PRODUCT_TB_KEMIN_NAME","PRODUCT_TB_NOVUS_NAME"};
    String x;
    int i;
    for (i=0; i< tables.length; i++){
        x = tables[i];
        Cursor cursor =  database.rawQuery(" SELECT * FROM " + x +" WHERE " +  DatabaseHelper.CLN_PRODUCTS + " LIKE ?",new String[]{modelSearch+"%"} );
        if(cursor != null && cursor.moveToFirst()){

            do {
                int id = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.CLN_ID));
                String product = cursor.getString(cursor.getColumnIndexOrThrow(CLN_PRODUCTS));

                Product c = new Product(id,product);
                cars.add(c);
            }
            while (cursor.moveToNext());
            cursor.close();
        }
    }
    return  cars;
}

لكن يحدث خطأ أيضا فبرجاء الماساعدة فى ضبط الكود

1 Like
#4

البحث يعمل الآن بطريقة صحيحة حينما قمت بتعديل محتوى المصفوفة الى اسماء الجداول بعمل import لهم من الكلاس المعرفين بهم كالآتى

    String [] tables = {PRODUCT_TB_NAME,PRODUCT_TB_INVESA_NAME,PRODUCT_TB_INTERCHEMIE_NAME,PRODUCT_TB_KEMIN_NAME,PRODUCT_TB_NOVUS_NAME};

بدلا من كتابتهمم كنصوص فى المرة السابقة
شكرا جزيلا

1 Like
#5

معذرة لكثرة الأسئلة وشكرا على التعاون
أنا استدعى دالة البحث السابقة فى اكتيفيتى عبارة عن recyclerview عن طريق هذا الكود بعلامة البحث فى ال menu وتعمل بشكل طبيعى

public boolean onQueryTextSubmit(String query) {
            db.open();
            ArrayList<Product> cars = db.searchProducts(query);
            db.close();

            adapter.setCars(cars);
            adapter.notifyDataSetChanged();
            return false;
        }

الآن أريد أن استدعى دالة البحث فى ال mainActivity ولكنها عبارة عن linearlayout وبدون adapter ويحدث خطأ عند adapter.set(cars) فكيف اعدل الكود
وشكرا جزيلا

#6

هل من الممكن وضع صورة توضح مزيد من المعلومات عن رسالة الخطأ وهل يمكنك التأكد انه يمكنك استخدام الadapter ضمن mainActivity

#7

لا يحدث خطأ عند تسطيب البرنامج ولكن الخطأ يحدث عند كتابة اى حرف فى البحث
وهذا ما يظهر فى ال logcat

05-08 03:31:37.189 30411-30411/com.example.practice W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40e66930)
05-08 03:31:37.209 30411-30411/com.example.practice E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.practice.MainActivity$9.onQueryTextChange(MainActivity.java:167)
at androidx.appcompat.widget.SearchView.onTextChanged(SearchView.java:1182)
at androidx.appcompat.widget.SearchView$10.onTextChanged(SearchView.java:1720)
at android.widget.TextView.sendOnTextChanged(TextView.java:8366)
at android.widget.TextView.handleTextChanged(TextView.java:8428)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10367)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:676)
at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:435)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:333)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5283)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)

#8

#9

عذرا لعدم تمكننا من مساعدتك في هذه المشكلة ولكن رسالة الخطأ تدل على وجود عنصر null وهو سبب المشكلة
تم نقل استفسارك للقسم المختص وسيتم الرد عليك باقرب وقت ممكن

1 Like
#10

هل يمكنك التحقق من السطر MainActivity.java:167 حيث هناك متغير فارغ Null

1 Like
#11
                db.open();

وهذا كود الدالة كاملا

 public boolean onQueryTextChange(String newText) {
            db.open();
            ArrayList<Product> cars = db.searchProducts(newText);
            db.close();

            adapter.setCars(cars);
            adapter.notifyDataSetChanged();

            return false;
        }
    });
#12

قمت باضافة هذا السطر والذى كنت قد نسيته داخل ال oncreate

db =  DatabaseAccess.getInstance(this);

والآن اصبح هذا الذى يظهر بال logcat
,

والسطر رقم 174 هو

                adapter.setCars(cars);
#13

هل يمكنك تجربة اعطاء cars قيمة افتراضية قبل استخدامها حيث من الممكن انه يظهر خطأ بسبب امكانية ان تأخذ cars قيمة null

#14

دالة setcars معرفة فى كلاس اخر وهو كلاس ال adapter الخاص بالrecyclerview لكلاسات اخرى

وهذه هذا جزء من الكود الموجود به

public ArrayList<Product> getCars() {
    return cars;
}

public void setCars(ArrayList<Product> cars) {
    this.cars = cars;
}
private ArrayList<Product> cars;
public CarRVAdapter(ArrayList<Product> cars ){
    this.cars = cars;
}

فكيف اقوم باعطاء القيمة الافتراضية