با لیست داده ها در پلتفرم های اپل کار کنید

یک مرجع FIRDatabase دریافت کنید

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

سویفت

توجه: این محصول Firebase در هدف App Clip موجود نیست.
var ref: DatabaseReference!

ref = Database.database().reference()

هدف-C

توجه: این محصول Firebase در هدف App Clip موجود نیست.
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];

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

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

از روش childByAutoId برای اضافه کردن داده ها به یک لیست در برنامه های چند کاربره استفاده کنید. روش childByAutoId هر بار که فرزند جدیدی به مرجع مشخص شده Firebase اضافه می شود، یک کلید منحصر به فرد ایجاد می کند. با استفاده از این کلیدهای تولید شده خودکار برای هر عنصر جدید در لیست، چندین مشتری می توانند کودکان را به طور همزمان بدون تداخل نوشتن به یک مکان اضافه کنند. کلید منحصر به فرد تولید شده توسط childByAutoId بر اساس یک مهر زمانی است، بنابراین موارد فهرست به طور خودکار به ترتیب زمانی مرتب می شوند.

می‌توانید از ارجاع داده‌های جدید بازگردانده‌شده توسط روش childByAutoId برای دریافت مقدار کلید تولید شده خودکار فرزند یا تنظیم داده‌ها برای فرزند استفاده کنید. فراخوانی getKey در مرجع childByAutoId ، کلید تولید شده خودکار را برمی گرداند.

شما می توانید از این کلیدهای تولید شده خودکار برای ساده سازی ساختار داده خود استفاده کنید. برای اطلاعات بیشتر، به مثال فن خروجی داده مراجعه کنید.

به رویدادهای کودک گوش دهید

رویدادهای فرزند در پاسخ به عملیات خاصی که برای فرزندان یک گره از عملیاتی مانند فرزند جدید اضافه شده از طریق روش childByAutoId یا فرزندی که از طریق روش updateChildValues ​​به روز می شود، فعال می شوند.

نوع رویداد استفاده معمولی
FIRDataEventTypeChildAdded لیستی از آیتم ها را بازیابی کنید یا برای اضافات به لیستی از موارد گوش دهید. این رویداد یک بار برای هر فرزند موجود و سپس هر بار که یک فرزند جدید به مسیر مشخص شده اضافه می شود، راه اندازی می شود. یک عکس فوری حاوی داده‌های کودک جدید به شنونده ارسال می‌شود.
FIRDataEventTypeChildChanged به تغییرات در موارد موجود در یک لیست گوش دهید. هر زمانی که گره فرزند اصلاح شود، این رویداد فعال می شود. این شامل هرگونه تغییر در نوادگان گره فرزند می شود. عکس فوری ارسال شده به شنونده رویداد حاوی داده های به روز شده برای کودک است.
FIRDataEventTypeChildRemoved به مواردی که از لیست حذف می شوند گوش دهید. این رویداد زمانی فعال می شود که یک فرزند فوری حذف شود. عکس فوری ارسال شده به بلوک برگشت به تماس حاوی داده های فرزند حذف شده است.
FIRDataEventTypeChildMoved به تغییرات در ترتیب اقلام در یک لیست مرتب گوش دهید. این رویداد زمانی فعال می‌شود که به‌روزرسانی باعث سفارش مجدد کودک شود. برای داده هایی استفاده می شود که توسط queryOrderedByChild یا queryOrderedByValue مرتب شده اند.

هر یک از اینها با هم می توانند برای گوش دادن به تغییرات یک گره خاص در پایگاه داده مفید باشند. به عنوان مثال، یک برنامه وبلاگ نویسی اجتماعی ممکن است از این روش ها برای نظارت بر فعالیت در نظرات یک پست استفاده کند، همانطور که در زیر نشان داده شده است:

سویفت

توجه: این محصول Firebase در هدف App Clip موجود نیست.
// Listen for new comments in the Firebase database
commentsRef.observe(.childAdded, with: { (snapshot) -> Void in
  self.comments.append(snapshot)
  self.tableView.insertRows(
    at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})
// Listen for deleted comments in the Firebase database
commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in
  let index = self.indexOfMessage(snapshot)
  self.comments.remove(at: index)
  self.tableView.deleteRows(
    at: [IndexPath(row: index, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})

هدف-C

توجه: این محصول Firebase در هدف App Clip موجود نیست.
// Listen for new comments in the Firebase database
[_commentsRef
              observeEventType:FIRDataEventTypeChildAdded
              withBlock:^(FIRDataSnapshot *snapshot) {
                [self.comments addObject:snapshot];
                [self.tableView insertRowsAtIndexPaths:@[
                  [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments]
                ]
                                      withRowAnimation:UITableViewRowAnimationAutomatic];
              }];
// Listen for deleted comments in the Firebase database
[_commentsRef
 observeEventType:FIRDataEventTypeChildRemoved
 withBlock:^(FIRDataSnapshot *snapshot) {
   int index = [self indexOfMessage:snapshot];
   [self.comments removeObjectAtIndex:index];
   [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]]
                         withRowAnimation:UITableViewRowAnimationAutomatic];
 }];

به رویدادهای ارزشی گوش دهید

در حالی که گوش دادن به رویدادهای کودک روش توصیه شده برای خواندن لیست های داده ها است، موقعیت هایی وجود دارد که گوش دادن به رویدادهای ارزش در مرجع فهرست مفید است.

پیوستن ناظر FIRDataEventTypeValue به لیستی از داده ها، کل لیست داده ها را به صورت یک DataSnapshot برمی گرداند، که سپس می توانید برای دسترسی به تک تک فرزندان، آن را حلقه بزنید.

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

سویفت

توجه: این محصول Firebase در هدف App Clip موجود نیست.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

هدف-C

توجه: این محصول Firebase در هدف App Clip موجود نیست.
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

این الگو زمانی می‌تواند مفید باشد که می‌خواهید به جای گوش دادن به رویدادهای اضافه شده فرزند، همه فرزندان یک لیست را در یک عملیات واکشی کنید.

مرتب سازی و فیلتر کردن داده ها

شما می توانید از کلاس Realtime Database FIRDatabaseQuery برای بازیابی داده های مرتب شده بر اساس کلید، بر اساس مقدار یا مقدار فرزند استفاده کنید. همچنین می توانید نتیجه مرتب شده را به تعداد مشخصی از نتایج یا طیفی از کلیدها یا مقادیر فیلتر کنید.

مرتب سازی داده ها

برای بازیابی داده‌های مرتب شده، با مشخص کردن یکی از روش‌های ترتیب‌بندی شده شروع کنید تا نحوه ترتیب‌بندی نتایج را مشخص کنید:

روش استفاده
queryOrderedByKey نتایج را با کلیدهای فرزند مرتب کنید.
queryOrderedByValue نتایج را بر اساس مقادیر فرزند مرتب کنید.
queryOrderedByChild نتایج را بر اساس مقدار کلید فرزند مشخص شده یا مسیر فرزند تودرتو مرتب کنید.

هر بار فقط می توانید از یک روش سفارشی استفاده کنید. چندین بار فراخوانی یک متد سفارشی در یک کوئری یک خطا ایجاد می کند.

مثال زیر نشان می‌دهد که چگونه می‌توانید فهرستی از پست‌های برتر کاربر را که بر اساس تعداد ستاره آنها مرتب شده‌اند، بازیابی کنید:

سویفت

توجه: این محصول Firebase در هدف App Clip موجود نیست.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

هدف-C

توجه: این محصول Firebase در هدف App Clip موجود نیست.
// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

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

فراخوانی متد queryOrderedByChild کلید فرزند را برای مرتب کردن نتایج مشخص می کند. در این مثال، پست ها بر اساس مقدار فرزند "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 با تعیین مسیر نسبی فرزند تودرتو در تماس queryOrderedByChild خود مرتب کنیم.

سویفت

توجه: این محصول Firebase در هدف App Clip موجود نیست.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

هدف-C

توجه: این محصول Firebase در هدف App Clip موجود نیست.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

برای اطلاعات بیشتر در مورد نحوه ترتیب‌دهی انواع دیگر داده‌ها، به نحوه ترتیب داده‌های جستجو مراجعه کنید.

فیلتر کردن داده ها

برای فیلتر کردن داده‌ها، می‌توانید هر یک از روش‌های محدود یا محدوده را با یک روش سفارشی در هنگام ساخت یک پرس و جو ترکیب کنید.

روش استفاده
queryLimitedToFirst حداکثر تعداد آیتم هایی را برای بازگشت از ابتدای فهرست ترتیب یافته نتایج تنظیم می کند.
queryLimitedToLast حداکثر تعداد مواردی را برای بازگشت از انتهای لیست نتایج مرتب شده تنظیم می کند.
queryStartingAtValue بسته به روش سفارشی انتخاب شده، موارد بزرگتر یا مساوی با کلید یا مقدار مشخص شده را برگردانید.
queryStartingAfterValue بسته به روش سفارشی انتخاب شده، موارد بزرگتر از کلید یا مقدار مشخص شده را برگردانید.
queryEndingAtValue بسته به روش سفارشی انتخاب شده، موارد کمتر یا مساوی با کلید یا مقدار مشخص شده را برگردانید.
queryEndingBeforeValue بسته به روش انتخاب شده، موارد کمتر از کلید یا مقدار مشخص شده را برگردانید.
queryEqualToValue بسته به روش سفارشی انتخاب شده، موارد را برابر با کلید یا مقدار مشخص شده برگردانید.

برخلاف روش‌های مرتب‌سازی، می‌توانید چندین تابع محدود یا محدوده را ترکیب کنید. برای مثال، می‌توانید روش‌های queryStartingAtValue و queryEndingAtValue را ترکیب کنید تا نتایج را به محدوده مشخصی از مقادیر محدود کنید.

تعداد نتایج را محدود کنید

می‌توانید از روش‌های queryLimitedToFirst و queryLimitedToLast برای تنظیم حداکثر تعداد فرزندان برای همگام‌سازی برای یک تماس معین استفاده کنید. به عنوان مثال، اگر از queryLimitedToFirst برای تعیین محدودیت 100 استفاده می کنید، در ابتدا فقط تا 100 تماس FIRDataEventTypeChildAdded دریافت می کنید. اگر کمتر از 100 مورد در پایگاه داده Firebase خود ذخیره کرده باشید، برای هر مورد یک FIRDataEventTypeChildAdded پاسخ به تماس فعال می شود.

با تغییر موارد، برای مواردی که وارد پرس و جو می‌شوند، FIRDataEventTypeChildAdded و برای مواردی که از آن خارج می‌شوند، تماس‌های FIRDataEventTypeChildRemoved دریافت می‌کنید، به طوری که تعداد کل 100 باقی می‌ماند.

مثال زیر نشان می دهد که چگونه یک برنامه وبلاگ نویسی نمونه ممکن است لیستی از 100 پست اخیر همه کاربران را بازیابی کند:

سویفت

توجه: این محصول Firebase در هدف App Clip موجود نیست.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

هدف-C

توجه: این محصول Firebase در هدف App Clip موجود نیست.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

بر اساس کلید یا مقدار فیلتر کنید

می‌توانید از queryStartingAtValue ، queryStartingAfterValue ، queryEndingAtValue ، queryEndingBeforeValue ، و queryEqualToValue برای انتخاب نقاط شروع، پایان و معادل دلخواه برای جستارها استفاده کنید. این می‌تواند برای صفحه‌بندی داده‌ها یا یافتن مواردی با کودکان که دارای ارزش خاصی هستند مفید باشد.

نحوه سفارش داده های پرس و جو

این بخش توضیح می‌دهد که چگونه داده‌ها بر اساس هر یک از روش‌های مرتب‌سازی در کلاس FIRDatabaseQuery مرتب می‌شوند.

queryOrderedByKey

هنگام استفاده از queryOrderedByKey برای مرتب‌سازی داده‌های خود، داده‌ها به ترتیب صعودی بر اساس کلید بازگردانده می‌شوند.

  1. کودکان دارای کلیدی که می تواند به عنوان یک عدد صحیح 32 بیتی تجزیه شود، در درجه اول قرار می گیرند و به ترتیب صعودی مرتب می شوند.
  2. کودکان با مقدار رشته به عنوان کلید در مرحله بعدی قرار می گیرند که از نظر واژگانی به ترتیب صعودی مرتب شده اند.

queryOrderedByValue

هنگام استفاده از queryOrderedByValue ، کودکان بر اساس مقدارشان مرتب می شوند. معیارهای ترتیب مانند queryOrderedByChild هستند، با این تفاوت که مقدار گره به جای مقدار کلید فرزند مشخص شده استفاده می شود.

queryOrderedByChild

هنگام استفاده از queryOrderedByChild ، داده هایی که حاوی کلید فرزند مشخص شده هستند به صورت زیر مرتب می شوند:

  1. کودکان با مقدار nil برای کلید فرزند مشخص شده اول هستند.
  2. کودکان با مقدار false برای کلید فرزند مشخص شده در مرحله بعدی قرار می گیرند. اگر چند فرزند مقدار false داشته باشند، از نظر واژگانی بر اساس کلید مرتب می شوند.
  3. کودکان با مقدار true برای کلید فرزند مشخص شده در مرحله بعدی قرار می گیرند. اگر چند فرزند مقدار true داشته باشند، از نظر واژگانی بر اساس کلید مرتب می شوند.
  4. کودکان با مقدار عددی در مرحله بعدی قرار می گیرند که به ترتیب صعودی مرتب شده اند. اگر چندین فرزند مقدار عددی یکسانی برای گره فرزند مشخص شده داشته باشند، آنها بر اساس کلید مرتب می شوند.
  5. رشته ها بعد از اعداد آمده و از نظر واژگانی به ترتیب صعودی مرتب شده اند. اگر چندین فرزند مقدار یکسانی برای گره فرزند مشخص شده داشته باشند، آنها از نظر واژگانی بر اساس کلید مرتب می شوند.
  6. اشیاء در آخر قرار می گیرند و از نظر واژگانی بر اساس کلید به ترتیب صعودی مرتب می شوند.

شنوندگان را جدا کنید

وقتی از ViewController خارج می‌شوید، مشاهده‌کنندگان به‌طور خودکار همگام‌سازی داده‌ها را متوقف نمی‌کنند. اگر یک ناظر به درستی حذف نشود، به همگام سازی داده ها با حافظه محلی ادامه می دهد و هر شیء گرفته شده در بسته شدن کنترل کننده رویداد را حفظ می کند، که می تواند باعث نشت حافظه شود. وقتی دیگر نیازی به مشاهده‌گر نیست، با ارسال FIRDatabaseHandle مرتبط به متد removeObserverWithHandle آن را حذف کنید.

هنگامی که یک بلوک پاسخ به تماس را به یک مرجع اضافه می کنید، یک FIRDatabaseHandle برمی گردد. از این دسته ها می توان برای حذف بلوک برگشت به تماس استفاده کرد.

اگر چندین شنونده به یک مرجع پایگاه داده اضافه شده باشد، هر شنونده زمانی فراخوانی می شود که رویدادی مطرح شود. به منظور توقف همگام سازی داده ها در آن مکان، باید با فراخوانی روش removeAllObservers ، همه ناظران را در یک مکان حذف کنید.

فراخوانی removeObserverWithHandle یا removeAllObservers در شنونده به طور خودکار شنوندگان ثبت شده در گره های فرزند خود را حذف نمی کند. همچنین باید آن مراجع یا دسته ها را پیگیری کنید تا آنها را حذف کنید.

مراحل بعدی