یک مرجع FIRDatabase دریافت کنید
برای خواندن یا نوشتن داده ها از پایگاه داده، به یک نمونه از FIRDatabaseReference
نیاز دارید:
سویفت
var ref: DatabaseReference! ref = Database.database().reference()
هدف-C
@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 مرتب شده اند. |
هر یک از اینها با هم می توانند برای گوش دادن به تغییرات یک گره خاص در پایگاه داده مفید باشند. به عنوان مثال، یک برنامه وبلاگ نویسی اجتماعی ممکن است از این روش ها برای نظارت بر فعالیت در نظرات یک پست استفاده کند، همانطور که در زیر نشان داده شده است:
سویفت
// 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
// 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 برمی گرداند، که سپس می توانید برای دسترسی به تک تک فرزندان، آن را حلقه بزنید.
حتی زمانی که فقط یک مورد منطبق برای پرس و جو وجود دارد، عکس فوری همچنان یک لیست است. فقط شامل یک مورد واحد است. برای دسترسی به آیتم، باید روی نتیجه حلقه بزنید:
سویفت
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
هدف-C
[_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 | نتایج را بر اساس مقدار کلید فرزند مشخص شده یا مسیر فرزند تودرتو مرتب کنید. |
هر بار فقط می توانید از یک روش سفارشی استفاده کنید. چندین بار فراخوانی یک متد سفارشی در یک کوئری یک خطا ایجاد می کند.
مثال زیر نشان میدهد که چگونه میتوانید فهرستی از پستهای برتر کاربر را که بر اساس تعداد ستاره آنها مرتب شدهاند، بازیابی کنید:
سویفت
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
هدف-C
// 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
خود مرتب کنیم.
سویفت
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
هدف-C
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 پست اخیر همه کاربران را بازیابی کند:
سویفت
// 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
// 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
برای مرتبسازی دادههای خود، دادهها به ترتیب صعودی بر اساس کلید بازگردانده میشوند.
- کودکان دارای کلیدی که می تواند به عنوان یک عدد صحیح 32 بیتی تجزیه شود، در درجه اول قرار می گیرند و به ترتیب صعودی مرتب می شوند.
- کودکان با مقدار رشته به عنوان کلید در مرحله بعدی قرار می گیرند که از نظر واژگانی به ترتیب صعودی مرتب شده اند.
queryOrderedByValue
هنگام استفاده از queryOrderedByValue
، کودکان بر اساس مقدارشان مرتب می شوند. معیارهای ترتیب مانند queryOrderedByChild
هستند، با این تفاوت که مقدار گره به جای مقدار کلید فرزند مشخص شده استفاده می شود.
queryOrderedByChild
هنگام استفاده از queryOrderedByChild
، داده هایی که حاوی کلید فرزند مشخص شده هستند به صورت زیر مرتب می شوند:
- کودکان با مقدار
nil
برای کلید فرزند مشخص شده اول هستند. - کودکان با مقدار
false
برای کلید فرزند مشخص شده در مرحله بعدی قرار می گیرند. اگر چند فرزند مقدارfalse
داشته باشند، از نظر واژگانی بر اساس کلید مرتب می شوند. - کودکان با مقدار
true
برای کلید فرزند مشخص شده در مرحله بعدی قرار می گیرند. اگر چند فرزند مقدارtrue
داشته باشند، از نظر واژگانی بر اساس کلید مرتب می شوند. - کودکان با مقدار عددی در مرحله بعدی قرار می گیرند که به ترتیب صعودی مرتب شده اند. اگر چندین فرزند مقدار عددی یکسانی برای گره فرزند مشخص شده داشته باشند، آنها بر اساس کلید مرتب می شوند.
- رشته ها بعد از اعداد آمده و از نظر واژگانی به ترتیب صعودی مرتب شده اند. اگر چندین فرزند مقدار یکسانی برای گره فرزند مشخص شده داشته باشند، آنها از نظر واژگانی بر اساس کلید مرتب می شوند.
- اشیاء در آخر قرار می گیرند و از نظر واژگانی بر اساس کلید به ترتیب صعودی مرتب می شوند.
شنوندگان را جدا کنید
وقتی از ViewController
خارج میشوید، مشاهدهکنندگان بهطور خودکار همگامسازی دادهها را متوقف نمیکنند. اگر یک ناظر به درستی حذف نشود، به همگام سازی داده ها با حافظه محلی ادامه می دهد و هر شیء گرفته شده در بسته شدن کنترل کننده رویداد را حفظ می کند، که می تواند باعث نشت حافظه شود. وقتی دیگر نیازی به مشاهدهگر نیست، با ارسال FIRDatabaseHandle
مرتبط به متد removeObserverWithHandle
آن را حذف کنید.
هنگامی که یک بلوک پاسخ به تماس را به یک مرجع اضافه می کنید، یک FIRDatabaseHandle
برمی گردد. از این دسته ها می توان برای حذف بلوک برگشت به تماس استفاده کرد.
اگر چندین شنونده به یک مرجع پایگاه داده اضافه شده باشد، هر شنونده زمانی فراخوانی می شود که رویدادی مطرح شود. به منظور توقف همگام سازی داده ها در آن مکان، باید با فراخوانی روش removeAllObservers
، همه ناظران را در یک مکان حذف کنید.
فراخوانی removeObserverWithHandle
یا removeAllObservers
در شنونده به طور خودکار شنوندگان ثبت شده در گره های فرزند خود را حذف نمی کند. همچنین باید آن مراجع یا دسته ها را پیگیری کنید تا آنها را حذف کنید.