التعامل مع قوائم البيانات على الويب

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

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

Web

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web

var database = firebase.database();

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

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

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

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

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

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

Web

import { getDatabase, ref, push, set } from "firebase/database";

// Create a new post reference with an auto-generated id
const db = getDatabase();
const postListRef = ref(db, 'posts');
const newPostRef = push(postListRef);
set(newPostRef, {
    // ...
});

Web

// Create a new post reference with an auto-generated id
var postListRef = firebase.database().ref('posts');
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

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

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

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

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

Web

import { getDatabase, ref, onChildAdded, onChildChanged, onChildRemoved } from "firebase/database";

const db = getDatabase();
const commentsRef = ref(db, 'post-comments/' + postId);
onChildAdded(commentsRef, (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

onChildChanged(commentsRef, (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

onChildRemoved(commentsRef, (data) => {
  deleteComment(postElement, data.key);
});

Web

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', (data) => {
  deleteComment(postElement, data.key);
});

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

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

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

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

Web

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const dbRef = ref(db, '/a/b/c');

onValue(dbRef, (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    const childKey = childSnapshot.key;
    const childData = childSnapshot.val();
    // ...
  });
}, {
  onlyOnce: true
});

Web

ref.once('value', (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

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

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

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

فرز البيانات

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

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

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

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

Web

import { getDatabase, ref, query, orderByChild } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const myUserId = auth.currentUser.uid;
const topUserPostsRef = query(ref(db, 'user-posts/' + myUserId), orderByChild('starCount'));

Web

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().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().

Web

import { getDatabase, ref, query, orderByChild } from "firebase/database";

const db = getDatabase();
const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));

Web

var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

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

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

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

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

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

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

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

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

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

Web

import { getDatabase, ref, query, limitToLast } from "firebase/database";

const db = getDatabase();
const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));

Web

var recentPostsRef = firebase.database().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() على أي أدوات استماع تابعة للأطفال لإزالة رد الاتصال.

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