با لیست داده ها کار کنید

یک مرجع پایگاه داده دریافت کنید

برای خواندن یا نوشتن داده ها از پایگاه داده، به یک نمونه از DatabaseReference نیاز دارید:

DatabaseReference ref = FirebaseDatabase.instance.ref();

خواندن و نوشتن لیست ها

به لیست داده ها اضافه کنید

از متد push() برای اضافه کردن داده ها به یک لیست در برنامه های چند کاربره استفاده کنید. هر بار که یک فرزند جدید به مرجع مشخص شده Firebase اضافه می شود، متد push() یک کلید منحصر به فرد ایجاد می کند. با استفاده از این کلیدهای تولید شده خودکار برای هر عنصر جدید در لیست، چندین مشتری می توانند کودکان را به طور همزمان بدون تداخل نوشتن به یک مکان اضافه کنند. کلید منحصر به فرد تولید شده توسط 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 به لیستی از داده‌ها، کل فهرست داده‌ها را به‌عنوان یک عکس فوری برمی‌گرداند که سپس می‌توانید برای دسترسی به تک تک کودکان، آن را حلقه بزنید.

حتی زمانی که فقط یک مورد منطبق برای پرس و جو وجود دارد، عکس فوری همچنان یک لیست است. فقط شامل یک مورد واحد است. برای دسترسی به آیتم، باید روی نتیجه حلقه بزنید:

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");

این یک پرس و جو را تعریف می کند که وقتی با یک شنونده کودک ترکیب می شود، مشتری را با پست های کاربر از مسیر موجود در پایگاه داده بر اساس شناسه کاربری آن ها، به ترتیب بر اساس تعداد ستاره هایی که هر پست دریافت کرده است، همگام می کند. این تکنیک استفاده از شناسه‌ها به‌عنوان کلیدهای فهرست، فن‌آوری داده‌ها نامیده می‌شود، می‌توانید اطلاعات بیشتری درباره آن در Structure Your Database بخوانید.

فراخوانی 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() همچنین باید در هر شنونده کودک فراخوانی شود تا پاسخ تماس را حذف کند.

مراحل بعدی