একটি FIRDatabaseReference পান
ডাটাবেস থেকে ডেটা পড়তে বা লিখতে, আপনার FIRDatabaseReference এর একটি উদাহরণ প্রয়োজন:
সুইফট
var ref: DatabaseReference! ref = Database.database().reference()
অবজেক্টিভ-সি
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
পড়া এবং লেখার তালিকা
তথ্যের তালিকায় যুক্ত করুন
মাল্টিইউজার অ্যাপ্লিকেশনের তালিকায় ডেটা যোগ করার জন্য childByAutoId পদ্ধতি ব্যবহার করুন। নির্দিষ্ট Firebase রেফারেন্সে নতুন চাইল্ড যোগ করার সময় childByAutoId পদ্ধতিটি একটি অনন্য কী তৈরি করে। তালিকার প্রতিটি নতুন উপাদানের জন্য এই স্বয়ংক্রিয়ভাবে তৈরি কীগুলি ব্যবহার করে, একাধিক ক্লায়েন্ট লেখার দ্বন্দ্ব ছাড়াই একই সময়ে একই স্থানে বাচ্চাদের যোগ করতে পারে। childByAutoId দ্বারা তৈরি অনন্য কীটি একটি টাইমস্ট্যাম্পের উপর ভিত্তি করে তৈরি করা হয়, তাই তালিকার আইটেমগুলি স্বয়ংক্রিয়ভাবে কালানুক্রমিকভাবে সাজানো হয়।
আপনি childByAutoId পদ্ধতি দ্বারা ফেরত আসা নতুন ডেটার রেফারেন্স ব্যবহার করে সন্তানের স্বয়ংক্রিয়ভাবে তৈরি কী বা সন্তানের জন্য সেট ডেটার মান পেতে পারেন। childByAutoId রেফারেন্সে getKey কল করলে স্বয়ংক্রিয়ভাবে তৈরি কীটি ফেরত আসে।
আপনার ডেটা স্ট্রাকচার সমতলকরণ সহজ করতে আপনি এই স্বয়ংক্রিয়ভাবে তৈরি কীগুলি ব্যবহার করতে পারেন। আরও তথ্যের জন্য, ডেটা ফ্যান-আউট উদাহরণটি দেখুন।
শিশুদের ঘটনা শুনুন
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 ) })
অবজেক্টিভ-সি
// 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 { ... } }
অবজেক্টিভ-সি
[_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")
অবজেক্টিভ-সি
// My top posts by number of stars FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"] child:[super getUid]] queryOrderedByChild:@"starCount"];
এই কোয়েরিটি ব্যবহারকারীর পোস্টগুলিকে তাদের ব্যবহারকারী আইডির উপর ভিত্তি করে ডাটাবেসের পাথ থেকে পুনরুদ্ধার করে, প্রতিটি পোস্টে প্রাপ্ত তারকা সংখ্যা অনুসারে। আইডিগুলিকে সূচক কী হিসাবে ব্যবহার করার এই কৌশলটিকে ডেটা ফ্যান আউট বলা হয়, আপনি এটি সম্পর্কে আরও পড়তে পারেন স্ট্রাকচার ইওর ডেটাবেস এ।
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",
}
}, এই ক্ষেত্রে, আমরা আমাদের queryOrderedByChild কলে নেস্টেড চাইল্ডের আপেক্ষিক পথ নির্দিষ্ট করে metrics কী-এর অধীনে নেস্টেড মান অনুসারে আমাদের তালিকার উপাদানগুলিকে ক্রমানুসারে সাজাতে পারি।
সুইফট
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
অবজেক্টিভ-সি
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
অন্যান্য ডেটা টাইপ কীভাবে সাজানো হয় সে সম্পর্কে আরও তথ্যের জন্য, কোয়েরি ডেটা কীভাবে সাজানো হয় তা দেখুন।
ডেটা ফিল্টার করা হচ্ছে
ডেটা ফিল্টার করার জন্য, আপনি একটি কোয়েরি তৈরি করার সময় যেকোনো সীমা বা পরিসর পদ্ধতিকে একটি অর্ডার-বাই পদ্ধতির সাথে একত্রিত করতে পারেন।
| পদ্ধতি | ব্যবহার |
|---|---|
queryLimitedToFirst | ফলাফলের ক্রমানুসারে তালিকার শুরু থেকে ফিরে আসার জন্য সর্বোচ্চ সংখ্যক আইটেম সেট করে। |
queryLimitedToLast | ক্রমানুসারে ফলাফলের তালিকার শেষ থেকে ফিরে আসার জন্য সর্বোচ্চ সংখ্যক আইটেম সেট করে। |
queryStartingAtValue | নির্বাচিত ক্রম-দ্বারা পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের চেয়ে বড় বা সমান আইটেমগুলি ফেরত পাঠান। |
queryStartingAfterValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের চেয়ে বড় আইটেমগুলি ফেরত দিন। |
queryEndingAtValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের চেয়ে কম বা সমান আইটেমগুলি ফেরত দিন। |
queryEndingBeforeValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের চেয়ে কম আইটেম ফেরত দিন। |
queryEqualToValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের সমান আইটেমগুলি ফেরত দিন। |
অর্ডার-বাই মেথডের বিপরীতে, আপনি একাধিক লিমিট বা রেঞ্জ ফাংশন একত্রিত করতে পারেন। উদাহরণস্বরূপ, আপনি queryStartingAtValue এবং queryEndingAtValue মেথড একত্রিত করে ফলাফলগুলিকে একটি নির্দিষ্ট রেঞ্জের মানের মধ্যে সীমাবদ্ধ করতে পারেন।
ফলাফলের সংখ্যা সীমিত করুন
আপনি একটি নির্দিষ্ট কলব্যাকের জন্য সর্বাধিক কতগুলি শিশু সিঙ্ক করা হবে তা নির্ধারণ করতে queryLimitedToFirst এবং queryLimitedToLast পদ্ধতি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনি queryLimitedToFirst ব্যবহার করে ১০০ এর সীমা নির্ধারণ করেন, তাহলে আপনি প্রাথমিকভাবে কেবলমাত্র ১০০ টি FIRDataEventTypeChildAdded কলব্যাক পাবেন। যদি আপনার Firebase ডাটাবেসে ১০০ টিরও কম আইটেম সংরক্ষিত থাকে, তাহলে প্রতিটি আইটেমের জন্য একটি FIRDataEventTypeChildAdded কলব্যাক চালু হবে।
আইটেম পরিবর্তনের সাথে সাথে, আপনি কোয়েরিতে প্রবেশ করা আইটেমগুলির জন্য FIRDataEventTypeChildAdded কলব্যাক এবং বাদ পড়া আইটেমগুলির জন্য FIRDataEventTypeChildRemoved কলব্যাক পাবেন যাতে মোট সংখ্যা ১০০-তে থাকে।
নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি উদাহরণ ব্লগিং অ্যাপ সমস্ত ব্যবহারকারীর 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))!
অবজেক্টিভ-সি
// 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 ব্যবহার করার সময়, কী অনুসারে ডেটা ঊর্ধ্বক্রমানুসারে ফেরত পাঠানো হয়।
- ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায় এমন কী সহ শিশুদের প্রথমে আসে, আরোহী ক্রমে সাজানো হয়।
- যেসব শিশুদের কী হিসেবে স্ট্রিং মান থাকে, তারা পরবর্তীতে আসে, লেক্সিকোগ্রাফিকভাবে ঊর্ধ্বক্রমানুসারে সাজানো হয়।
queryOrderedByValue
queryOrderedByValue ব্যবহার করার সময়, শিশুদের তাদের মান অনুসারে সাজানো হয়। অর্ডারিং মানদণ্ড queryOrderedByChild এর মতোই, তবে নির্দিষ্ট চাইল্ড কী-এর মানের পরিবর্তে নোডের মান ব্যবহার করা হয়।
queryOrderedByChild
queryOrderedByChild ব্যবহার করার সময়, নির্দিষ্ট চাইল্ড কী ধারণকারী ডেটা নিম্নরূপ সাজানো হয়:
- নির্দিষ্ট চাইল্ড কী-এর জন্য
nilমান সহ শিশুরা প্রথমে আসে। - নির্দিষ্ট শিশু কী-এর জন্য
falseমান সহ শিশুদের পরে আসে। যদি একাধিক শিশুদেরfalseমান থাকে, তবে তাদের কী অনুসারে অভিধানিকভাবে সাজানো হয়। - নির্দিষ্ট child key-এর জন্য
trueমান সম্পন্ন শিশুদের পরে আসে। যদি একাধিক শিশুদেরtrueমান থাকে, তাহলে তাদের অভিধানিকভাবে key অনুসারে সাজানো হয়। - সংখ্যাসূচক মান সম্পন্ন শিশুরা পরবর্তীতে আসে, ঊর্ধ্বক্রমানুসারে সাজানো। যদি একাধিক শিশু নির্দিষ্ট শিশু নোডের জন্য একই সংখ্যাসূচক মান ধারণ করে, তাহলে তাদের কী অনুসারে সাজানো হয়।
- স্ট্রিংগুলি সংখ্যার পরে আসে এবং লেক্সিকোগ্রাফিকভাবে ঊর্ধ্বক্রমানুসারে সাজানো হয়। যদি একাধিক চাইল্ড নোডের জন্য একই মান থাকে, তাহলে সেগুলিকে কী দ্বারা লেক্সিকোগ্রাফিকভাবে সাজানো হয়।
- বস্তুগুলি শেষে আসে এবং শব্দকোষ অনুসারে কী অনুসারে ঊর্ধ্বক্রমানুসারে সাজানো হয়।
শ্রোতাদের আলাদা করুন
ViewController ত্যাগ করার সময় পর্যবেক্ষকরা স্বয়ংক্রিয়ভাবে ডেটা সিঙ্ক করা বন্ধ করে না। যদি কোনও পর্যবেক্ষক সঠিকভাবে সরানো না হয়, তবে এটি স্থানীয় মেমোরিতে ডেটা সিঙ্ক করতে থাকে এবং ইভেন্ট হ্যান্ডলার ক্লোজারে ক্যাপচার করা যেকোনো বস্তু ধরে রাখবে, যা মেমোরি লিক হতে পারে। যখন কোনও পর্যবেক্ষকের আর প্রয়োজন হয় না, তখন সংশ্লিষ্ট FIRDatabaseHandle কে removeObserverWithHandle পদ্ধতিতে পাস করে এটি সরিয়ে ফেলুন।
যখন আপনি একটি রেফারেন্সে একটি কলব্যাক ব্লক যোগ করেন, তখন একটি FIRDatabaseHandle ফিরে আসে। এই হ্যান্ডেলগুলি কলব্যাক ব্লকটি সরাতে ব্যবহার করা যেতে পারে।
যদি একটি ডাটাবেস রেফারেন্সে একাধিক লিসেনারের নাম যোগ করা থাকে, তাহলে যখন কোনও ইভেন্ট উত্থাপিত হয় তখন প্রতিটি লিসেনারের নাম ডাকা হয়। সেই স্থানে ডেটা সিঙ্ক করা বন্ধ করতে, আপনাকে removeAllObservers পদ্ধতিটি ব্যবহার করে একটি লোকেশনের সমস্ত পর্যবেক্ষককে সরিয়ে ফেলতে হবে।
লিসেনারে removeObserverWithHandle অথবা removeAllObservers কল করলে তার চাইল্ড নোডে নিবন্ধিত লিসেনার স্বয়ংক্রিয়ভাবে মুছে যাবে না; সেগুলি সরাতে আপনাকে সেই রেফারেন্স বা হ্যান্ডেলগুলির উপর নজর রাখতে হবে।