اذهب إلى المحتوى

السؤال

نشر

تحيه طيبه جميعا 

لدي استفسار لو تكرمتم 

انا اعمل استعلام للبيانات من FirebaseFirestore الكود شغال تمام ولكن المشكلة لدي حقل في FirebaseFirestore قمت بوضع اسم الدولة بداخله وكل المواضيع سوف تحتوي على هذا الحقل مع اختلاف الدولة من موضوع إلى موضوع المشكلة ان اسم الدولة البعض منهم الاحرف الصغيرة والبعض الكبيرة/

مثال الموضوع الاول  من دولة oman

الموضوع الثاني من دولة OMAN 

هيا دولة واحده ولكن اختلف طريقة الكتابة الان لو قمت بوضع دالة شرطية كالتالي في استعلام الفايربيز :

 .where('Country', isEqualTo: NameContry)

الفايربيز رح يفحص القيمة الموجود بداخل NameContry لو كانت احرف كبيره سوف احصل على عمان  OMAN  بدون oman  هذا مشكلتي

كيف يمكن حل هذا الامر؟ بحيث انني احصل على الكبيره والصغيرة في نفس الوقت ؟

Recommended Posts

  • 1
نشر

من الأفضل تخزين البيانات في صورة Lowercase من البداية في قاعدة البيانات.، ثم البحث عنها لحل لتلك المشكلة، أي سنبحث عن البيانات بعد أن قمنا بتخزينها في صورة حروف صغيرة:

String nameCountryLower = NameContry.toLowerCase();

FirebaseFirestore.instance
  .collection('my_collection')
  .where('Country', isEqualTo: nameCountryLower)
  .get()
  .then((querySnapshot) {
    // يمكنك استخدام querySnapshot.docs للوصول إلى النتائج
    // ...
  });

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

https://firebase.google.com/docs/firestore/solutions/search

وهناك حل آخر:

من خلال تحويل الاستعلام البحثي إلى مجموعة من القيم المتغيرة (variations) والتي يتم البحث عنها جميعها في الحقل الذي يراد البحث عنه.

مثا: إذا كان البحث هو "oman" ، فسيتم تحويله إلى مجموعة ["oman"، "OMAN"، "Oman"] والتي تشمل جميع الحالات الممكنة لهذا الاستعلام بغض النظر عن حجم الأحرف.

ثم يتم إجراء استعلام "in" حيث يتم البحث عن جميع هذه القيم المتغيرة في الحقل الذي يراد البحث عنه. يدعم استعلام "in" ما يصل إلى 10 مساواة (==) بين القيم مع عامل التشغيل "OR" اللوجيكي. وبهذا يمكن الاحتفاظ بحقل واحد فقط "name" والبحث فيه باستخدام التغييرات المحتملة عليه.

List<String> variations = ["oman", "OMAN", "Oman"]; // TODO: write a function that converts the query string into this kind of Array
QuerySnapshot search = await FirebaseFirestore.instance.collection("users").where("name", whereIn: variations).get();

وهنا يتم استخدام متغير القائمة (List) بدلاً من مصفوفة (Array) وكذلك الاستعلام البحثي whereIn بدلاً من "in"، وبعد ذلك يتم استخدام الدالة get() للحصول على نتائج الاستعلام.

  • 1
نشر

حاول استخدام الدالة toLowerCase() لتحويل قيمة NameContry إلى حروف صغيرة، ثم استخدام هذه القيمة في استعلام Firestore.

مثال:

.where('Country', isEqualTo: NameContry.toLowerCase())

بهذا الشكل، سيتم تحويل قيمة NameContry إلى حروف صغيرة ومقارنتها مع قيمة الحقل "Country" في Firestore، بحيث لن يتم الاهتمام بحالة الأحرف.

وبذلك تستطيع البحث عن السجلات التي تحتوي على الدولة بغض النظر عن حالة الأحرف الموجودة في NameContry.

  • 0
نشر
بتاريخ On 19‏/4‏/2023 at 05:19 قال Mustafa Suleiman:

حاول استخدام الدالة toLowerCase() لتحويل قيمة NameContry إلى حروف صغيرة، ثم استخدام هذه القيمة في استعلام Firestore.

مثال:

.where('Country', isEqualTo: NameContry.toLowerCase())

بهذا الشكل، سيتم تحويل قيمة NameContry إلى حروف صغيرة ومقارنتها مع قيمة الحقل "Country" في Firestore، بحيث لن يتم الاهتمام بحالة الأحرف.

وبذلك تستطيع البحث عن السجلات التي تحتوي على الدولة بغض النظر عن حالة الأحرف الموجودة في NameContry.

اهلا بك اخي الكريم

اعتذر على تاخر ردي اول حاجه

بالنسبه الى الحل الذي ذكرته لم ينجح اخي الكريم

حسب ما فهمت ان المشكلة ان الفايربيز يتحسس للحروف بمعنى لو كنت حافظ بداخله oman  واجيت ابحث عن OMAN  لن ينجح الامر حقيقه هذا المشكلة لم اجد لها حل الى الان المفترض ان اوقف هذا الخاصية ولكني لم اجد الحل لفعل ذلك

  • 0
نشر
بتاريخ 11 دقائق مضت قال Mustafa Suleiman:

من الأفضل تخزين البيانات في صورة Lowercase من البداية في قاعدة البيانات.، ثم البحث عنها لحل لتلك المشكلة، أي سنبحث عن البيانات بعد أن قمنا بتخزينها في صورة حروف صغيرة:

String nameCountryLower = NameContry.toLowerCase();

FirebaseFirestore.instance
  .collection('my_collection')
  .where('Country', isEqualTo: nameCountryLower)
  .get()
  .then((querySnapshot) {
    // يمكنك استخدام querySnapshot.docs للوصول إلى النتائج
    // ...
  });

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

https://firebase.google.com/docs/firestore/solutions/search

وهناك حل آخر:

من خلال تحويل الاستعلام البحثي إلى مجموعة من القيم المتغيرة (variations) والتي يتم البحث عنها جميعها في الحقل الذي يراد البحث عنه.

مثا: إذا كان البحث هو "oman" ، فسيتم تحويله إلى مجموعة ["oman"، "OMAN"، "Oman"] والتي تشمل جميع الحالات الممكنة لهذا الاستعلام بغض النظر عن حجم الأحرف.

ثم يتم إجراء استعلام "in" حيث يتم البحث عن جميع هذه القيم المتغيرة في الحقل الذي يراد البحث عنه. يدعم استعلام "in" ما يصل إلى 10 مساواة (==) بين القيم مع عامل التشغيل "OR" اللوجيكي. وبهذا يمكن الاحتفاظ بحقل واحد فقط "name" والبحث فيه باستخدام التغييرات المحتملة عليه.

List<String> variations = ["oman", "OMAN", "Oman"]; // TODO: write a function that converts the query string into this kind of Array
QuerySnapshot search = await FirebaseFirestore.instance.collection("users").where("name", whereIn: variations).get();

وهنا يتم استخدام متغير القائمة (List) بدلاً من مصفوفة (Array) وكذلك الاستعلام البحثي whereIn بدلاً من "in"، وبعد ذلك يتم استخدام الدالة get() للحصول على نتائج الاستعلام.

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...