العمل باستخدام قوائم البيانات

الحصول على مرجع قاعدة بيانات

لقراءة البيانات أو كتابتها من قاعدة البيانات، تحتاج إلى مثيل DatabaseReference:

DatabaseReference ref = FirebaseDatabase.instance.ref();

قوائم القراءة والكتابة

إلحاق بقائمة من البيانات

يمكنك استخدام الطريقة push() لإلحاق البيانات بقائمة في التطبيقات المتعددة المستخدمين. تُنشئ الطريقة push() مفتاحًا فريدًا في كل مرة تتم فيها إضافة عنصر ثانوي جديد إلى مرجع Firebase المحدد. باستخدام هذه المفاتيح التي تم إنشاؤها تلقائيًا لكل عنصرًا جديدًا في القائمة، يمكن لعدة عملاء إضافة عناصر فرعية إلى الموقع ذاته في نفس الوقت بدون تعارضات كتابة. المفتاح الفريد الذي تم إنشاؤه من خلال push() تستند إلى طابع زمني، لذا يتمّ ترتيب عناصر القائمة تلقائيًا ترتيبًا زمنيًا.

يمكنك استخدام الإشارة إلى البيانات الجديدة التي تعرضها طريقة push() للحصول على قيمة المفتاح الذي تم إنشاؤه تلقائيًا للطفل أو مجموعة البيانات الخاصة به. تشير رسالة الأشكال البيانية تحتوي السمة .key الخاصة بمرجع push() على المفتاح الذي تم إنشاؤه تلقائيًا.

يمكنك استخدام هذه المفاتيح التي تم إنشاؤها تلقائيًا لتبسيط تنظيم بياناتك البنية. للمزيد من المعلومات، يُرجى الاطّلاع على مثال توزيع البيانات.

على سبيل المثال، يمكن استخدام push() لإضافة مشاركة جديدة إلى قائمة مشاركات. في تطبيق اجتماعي:

DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
  // ...
});

الاستماع إلى الأحداث الفرعية

يتم تشغيل الأحداث الفرعية استجابةً لعمليات محددة تحدث العناصر الثانوية لعقدة من إحدى العمليات، مثل إضافة عنصر فرعي جديد من خلال push() أو بيانات فرعية يتم تعديلها من خلال الطريقة update().

الحدث معدّل الاستخدام
onChildAdded استرداد قوائم العناصر أو الاستماع إلى الإضافات إلى قائمة من العناصر. يتم تشغيل هذا الحدث مرة واحدة لكل مؤسسة فرعية حالية ثم مرة أخرى كل مرة تتم فيها إضافة عنصر ثانوي جديد إلى المسار المحدد. المستمع مرر لقطة تحتوي على بيانات الطفل الجديد.
onChildChanged رصد التغييرات على العناصر في القائمة يتم تشغيل هذا الحدث في أي وقت يتم فيه تعديل عقدة فرعية. وتشمل هذه المعلومات ما يلي: أي تعديلات على العناصر التابعة للعقدة الفرعية. تم اجتياز الاختبار إلى أداة معالجة الحدث على البيانات المحدثة الخاصة بالفرع.
onChildRemoved رصد العناصر التي تتم إزالتها من القائمة يتم تشغيل هذا الحدث عندما إزالة عنصر ثانوي مباشر.تم تمرير اللقطة إلى حظر معاودة الاتصال يحتوي على بيانات العنصر الثانوي الذي تمت إزالته.
onChildMoved الاستماع إلى التغييرات التي تطرأ على ترتيب العناصر في قائمة مع ترتيب تتبع أحداث onChildMoved دائمًا onChildChanged الحدث الذي تسبب في ترتيب العنصر تغيير (بناءً على طريقة الترتيب الحالية).

يمكن أن يكون كل من هذه الأدوات معًا مفيدًا للاستماع إلى التغييرات إلى العقدة في قاعدة بيانات. على سبيل المثال، قد يستخدم أحد تطبيقات التدوين الاجتماعي هذه الطرق معًا لمراقبة النشاط في تعليقات المشاركة، كما هو موضح أدناه:

final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
  // A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
  // A comment has changed; use the key to determine if we are displaying this
  // comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
  // A comment has been removed; use the key to determine if we are displaying
  // this comment and if so remove it.
});

الاطّلاع على الأحداث القيّمة

وبينما يكون الاستماع إلى الأحداث الفرعية هو الطريقة الموصى بها لقراءة قوائم البيانات، هناك مواقف تكون الاستماع إلى أحداث القيمة على مرجع قائمة أمرًا مفيدًا.

سيؤدي إلحاق مستمع value بقائمة من البيانات إلى ظهور قائمة كاملة من البيانات كلقطة واحدة يمكنك بعد ذلك تكرارها إلى الوصول إلى أطفال معينين.

وحتى في حالة وجود تطابق واحد فقط لطلب البحث، تظل اللقطة list؛ فإنها تحتوي فقط على عنصر واحد. للوصول إلى العنصر، تحتاج إلى التكرار فوق النتيجة:

myTopPostsQuery.onValue.listen((event) {
  for (final child in event.snapshot.children) {
    // Handle the post.
  }
}, onError: (error) {
  // Error.
});

يمكن أن يكون هذا النمط مفيدًا عندما تريد استرجاع جميع العناصر الثانوية لقائمة في عملية واحدة، بدلاً من الاستماع إلى العناصر الثانوية الإضافية أحداث.

فرز البيانات وتصفيتها

يمكنك استخدام الفئة Query لاسترداد البيانات المُرتَّبة حسب. مفتاح أو حسب القيمة أو حسب القيمة الفرعية. يمكنك أيضًا فلترة النتيجة التي تم فرزها إلى عدد محدد من النتائج أو مجموعة من المفاتيح أو القيم.

فرز البيانات

لاسترداد البيانات التي تم فرزها، ابدأ بتحديد إحدى طرق الترتيب حسب لتحديد كيفية ترتيب النتائج:

الطريقة الاستخدام
orderByChild() يمكنك ترتيب النتائج حسب قيمة مفتاح فرعي محدّد أو مسار فرعي متداخل.
orderByKey() يمكنك ترتيب النتائج حسب المفاتيح الثانوية.
orderByValue() ترتيب النتائج حسب القيم الثانوية

يمكنك استخدام طريقة واحدة فقط لكل طلب على حدة. استدعاء طريقة الطلب حسب عدة مرات في نفس الاستعلام يؤدي إلى حدوث خطأ.

يوضح المثال التالي كيف يمكنك استرداد قائمة أهم المشاركات مرتبة حسب عدد النجوم:

final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
    .ref("user-posts/$myUserId")
    .orderByChild("starCount");

يحدّد ذلك طلب بحث يمكن دمجه مع مستمِع تابع مزامنة البرنامج مع مشاركات المستخدم من المسار في قاعدة البيانات استنادًا إلى رقم تعريف المستخدم، ويتم ترتيبها حسب عدد النجوم التي حصلت عليها كل مشاركة. يُطلق على أسلوب استخدام المعرفات كمفاتيح فهرس اسم توسيع البيانات، يمكنك قراءة المزيد حول ذلك في تنظيم قاعدة البيانات.

يحدد استدعاء طريقة orderByChild() المفتاح الفرعي لترتيب النتائج حسب. في هذه الحالة، يتم ترتيب المشاركات حسب قيمة المعنيّ بطفل واحد ("starCount") يمكن أيضًا ترتيب طلبات البحث حسب الأطفال، في حال كان لديك بيانات تبدو على النحو التالي:

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

في هذه الحالة، يمكننا ترتيب عناصر القائمة حسب القيم المتداخلة ضمن metrics من خلال تحديد المسار النسبي للعنصر الفرعي المدمج في مكالمة orderByChild().

final mostViewedPosts =
    FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');

لمزيد من المعلومات حول كيفية ترتيب أنواع البيانات الأخرى، راجِع كيفية ترتيب بيانات طلبات البحث.

تصفية البيانات

لتصفية البيانات، يمكنك دمج أي من طرق الحد أو النطاق مع الترتيب حسب عند إنشاء استعلام.

الطريقة الاستخدام
limitToFirst() لتعيين الحد الأقصى لعدد العناصر المراد عرضها من بداية قائمة نتائج مرتبة.
limitToLast() لضبط الحد الأقصى لعدد السلع المطلوب عرضها من نهاية طلب الشراء قائمة بالنتائج.
startAt() إرجاع عناصر أكبر من أو تساوي المفتاح أو القيمة المحددة، اعتمادًا على الطريقة المختارة.
startAfter() إرجاع عناصر أكبر من المفتاح أو القيمة المحددة اعتمادًا على الطريقة المختارة.
endAt() إرجاع عناصر أقل من أو تساوي المفتاح أو القيمة المحددة، اعتمادًا على الطريقة المختارة.
endBefore() إرجاع عناصر أقل من المفتاح أو القيمة المحدّدة اعتمادًا على الطريقة المختارة.
equalTo() إرجاع عناصر مساوية للمفتاح أو القيمة المحددة، بناءً على الترتيب حسب الطريقة التي تم اختيارها.

على عكس طرق الترتيب حسب، يمكنك الجمع بين دوال متعددة للحدود أو النطاقات. على سبيل المثال، يمكنك الجمع بين الطريقتَين startAt() وendAt() للحدّ من النتائج إلى نطاق محدد من القيم.

تحديد عدد النتائج

يمكنك استخدام الطريقتَين limitToFirst() وlimitToLast() لضبط الحد الأقصى لعدد العناصر الثانوية المطلوب مزامنتها لحدث معيّن. على سبيل المثال، إذا إذا كنت تستخدم limitToFirst() لضبط الحدّ الأقصى المسموح به البالغ 100، لن تتلقّى إلا إلى 100 حدث onChildAdded. إذا كان لديك أقل من 100 عنصر مخزن في قاعدة بيانات Firebase، يتم تنشيط حدث onChildAdded لكل عنصر.

ومع تغيُّر العناصر، ستتلقّى onChildAdded حدث للعناصر التي تدخل الاستعلام وonChildRemoved أحداث للعناصر التي يتم إفلاتها بحيث يظل العدد الإجمالي 100.

يوضح المثال التالي كيف يحدد مثال تطبيق التدوين طلب بحث استرداد قائمة بأحدث 100 مشاركة لجميع المستخدمين:

final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);

يحدد هذا المثال فقط استعلامًا لمزامنة البيانات التي يحتاج إليها أن يكون لديك مستمِع مُرفق.

الفلترة حسب المفتاح أو القيمة

يمكنك استخدام startAt() وstartAfter() وendAt() وendBefore() equalTo() لاختيار نقاط البداية والنهاية والتكافؤ العشوائية طلبات البحث. يمكن أن يكون هذا مفيدًا في تقسيم البيانات على صفحات أو العثور على عناصر تتضمّن أطفالاً. التي لها قيمة محددة.

كيف يتم ترتيب بيانات طلبات البحث

يوضح هذا القسم كيفية فرز البيانات حسب كل طريقة من الطرق بالترتيب في صف واحد (Query).

orderByChild

عند استخدام orderByChild()، تكون البيانات التي تحتوي على المفتاح الفرعي المحدّد هي مرتبة على النحو التالي:

  1. تأتي العناصر الثانوية بقيمة null للمفتاح الفرعي المحدّد أولاً.
  2. العناصر الثانوية بقيمة false للمفتاح الفرعي المحدّد لاحقًا. إذا كانت القيمة false للعديد من العناصر الثانوية، يتم تمثيلها مرتبة معجميًا حسب المفتاح.
  3. العناصر الثانوية بقيمة true للمفتاح الفرعي المحدّد لاحقًا. إذا كانت القيمة true للعديد من العناصر الثانوية، يتم تمثيلها مرتبة قاموسًا حسب المفتاح.
  4. تأتي الأطفال ذوي القيمة الرقمية بعد ذلك، مرتبة بترتيب تصاعدي. في حال حذف تكون لعناصر فرعية متعددة نفس القيمة الرقمية للعنصر الفرعي المحدد يتم فرزها حسب المفتاح.
  5. تأتي السلاسل بعد الأرقام ويتم ترتيبها بشكل قاموس تصاعديًا. طلبك. إذا كانت هناك عدة عناصر ثانوية لها نفس القيمة للعنصر الفرعي المحدد يتم ترتيبها قاموسًا حسب المفتاح.
  6. تأتي الكائنات في النهاية ويتم فرزها قاموسًا حسب المفتاح بترتيب تصاعدي.

orderByKey

عند استخدام orderByKey() لترتيب بياناتك، يتم عرض البيانات تصاعديًا. بالمفتاح.

  1. تأتي العناصر الثانوية التي تتضمن مفتاحًا يمكن تحليله كعدد صحيح 32 بت أولاً، ويتم ترتيبها تصاعديًا.
  2. يأتي العناصر الثانوية التي لها قيمة سلسلة كمفتاحها بعد ذلك، ويتم فرزها ترتيبًا تصاعديًا.

orderByValue

عند استخدام orderByValue()، يتم ترتيب العناصر الثانوية حسب قيمتها. ترتيب هذه المعايير هي نفسها في orderByChild()، باستثناء قيمة العقدة يتم استخدامه بدلاً من قيمة مفتاح فرعي محدد.

فصل المستمعين

تتم إزالة عمليات معاودة الاتصال من خلال استدعاء طريقة off() على مرجع قاعدة بيانات Firebase.

يمكنك إزالة مستمع واحد من خلال تمريره كمَعلمة إلى off(). سيؤدي الاتصال بالرقم off() في الموقع الجغرافي بدون وسيطات إلى إزالة جميع المستمعين في ذلك الوقت. الموقع.

لا يؤدي الاتصال بـ "off()" على مستمِع أحد الوالدَين إزالة المستمعين المسجَّلين في العُقد الفرعية تلقائيًا يجب أيضًا استدعاء off() على أي أدوات استماع تابعة للأطفال لإزالة رد الاتصال.

الخطوات التالية