একটি 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 ক্লাস ব্যবহার করে কী (key), ভ্যালু (value), বা কোনো চাইল্ডের ভ্যালু অনুসারে সাজানো ডেটা পুনরুদ্ধার করতে পারেন। এছাড়াও, আপনি সাজানো ফলাফলকে একটি নির্দিষ্ট সংখ্যক ফলাফলে অথবা কী বা ভ্যালুর একটি পরিসরে ফিল্টার করতে পারেন।
ডেটা সাজান
সাজানো ডেটা পেতে, ফলাফল কীভাবে সাজানো হবে তা নির্ধারণ করতে প্রথমে order-by পদ্ধতিগুলোর মধ্যে একটি নির্দিষ্ট করুন:
| পদ্ধতি | ব্যবহার |
|---|---|
queryOrderedByKey | চাইল্ড কী অনুসারে ফলাফলগুলো সাজান। |
queryOrderedByValue | চাইল্ড ভ্যালু অনুসারে ফলাফলগুলো সাজান। |
queryOrderedByChild | একটি নির্দিষ্ট চাইল্ড কী বা নেস্টেড চাইল্ড পাথের মান অনুসারে ফলাফল সাজান। |
আপনি একবারে শুধুমাত্র একটি order-by মেথড ব্যবহার করতে পারবেন। একই কোয়েরিতে একাধিকবার order-by মেথড কল করলে একটি এরর দেখা দেয়।
নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে আপনি একজন ব্যবহারকারীর সেরা পোস্টগুলির একটি তালিকা তাদের স্টার সংখ্যা অনুসারে সাজিয়ে পেতে পারেন:
সুইফট
// 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"];
অন্যান্য ডেটা টাইপগুলো কীভাবে সাজানো হয় সে সম্পর্কে আরও তথ্যের জন্য, “কোয়েরি ডেটা কীভাবে সাজানো হয়” দেখুন।
ডেটা ফিল্টার করা
কোয়েরি তৈরি করার সময় ডেটা ফিল্টার করতে আপনি limit বা range মেথডের যেকোনোটির সাথে order-by মেথড ব্যবহার করতে পারেন।
| পদ্ধতি | ব্যবহার |
|---|---|
queryLimitedToFirst | ফলাফলের ক্রমিক তালিকার শুরু থেকে ফেরত দেওয়া আইটেমের সর্বোচ্চ সংখ্যা নির্ধারণ করে। |
queryLimitedToLast | ফলাফলের ক্রমিক তালিকার শেষ থেকে ফেরত দেওয়া আইটেমের সর্বোচ্চ সংখ্যা নির্ধারণ করে। |
queryStartingAtValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের সমান বা তার চেয়ে বড় আইটেমগুলো ফেরত দেবে। |
queryStartingAfterValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের চেয়ে বড় আইটেমগুলো ফেরত দেবে। |
queryEndingAtValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের সমান বা তার চেয়ে কম আইটেমগুলো ফেরত দেওয়া হবে। |
queryEndingBeforeValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা মানের চেয়ে কম আইটেমগুলো ফেরত দেওয়া হবে। |
queryEqualToValue | নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে, নির্দিষ্ট কী বা ভ্যালুর সমান আইটেমগুলো ফেরত দিন। |
order-by মেথডগুলোর থেকে ভিন্নভাবে, আপনি একাধিক limit বা range ফাংশন একত্রিত করতে পারেন। উদাহরণস্বরূপ, ফলাফলকে একটি নির্দিষ্ট মানের পরিসরে সীমাবদ্ধ করতে আপনি queryStartingAtValue এবং queryEndingAtValue মেথডগুলো একত্রিত করতে পারেন।
ফলাফলের সংখ্যা সীমিত করুন
আপনি একটি নির্দিষ্ট কলব্যাকের জন্য সিঙ্ক করা চাইল্ডের সর্বোচ্চ সংখ্যা নির্ধারণ করতে queryLimitedToFirst এবং queryLimitedToLast মেথডগুলো ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনি queryLimitedToFirst ব্যবহার করে ১০০-এর একটি সীমা নির্ধারণ করেন, তাহলে আপনি প্রাথমিকভাবে সর্বোচ্চ ১০০টি FIRDataEventTypeChildAdded কলব্যাক পাবেন। যদি আপনার Firebase ডেটাবেসে ১০০টির কম আইটেম সংরক্ষিত থাকে, তাহলে প্রতিটি আইটেমের জন্য একটি করে FIRDataEventTypeChildAdded কলব্যাক ফায়ার হবে।
আইটেম পরিবর্তিত হওয়ার সাথে সাথে, কোয়েরিতে নতুন যুক্ত হওয়া আইটেমগুলোর জন্য আপনি FIRDataEventTypeChildAdded কলব্যাক এবং কোয়েরি থেকে বাদ পড়া আইটেমগুলোর জন্য FIRDataEventTypeChildRemoved কলব্যাক পাবেন, যাতে মোট সংখ্যা ১০০-তেই স্থির থাকে।
নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি আদর্শ ব্লগিং অ্যাপ সমস্ত ব্যবহারকারীর ১০০টি সাম্প্রতিকতম পোস্টের একটি তালিকা সংগ্রহ করতে পারে:
সুইফট
// 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 ক্লাসের প্রতিটি order-by মেথড ব্যবহার করে কীভাবে ডেটা সর্ট করা হয়, তা ব্যাখ্যা করা হয়েছে।
queryOrderedByKey
queryOrderedByKey ব্যবহার করে ডেটা সর্ট করার সময়, ডেটা কী (key) অনুযায়ী আরোহী ক্রমে ফেরত আসে।
- যেসব চাইল্ডের কী-কে ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায়, সেগুলো আরোহী ক্রমে প্রথমে আসে।
- যেসব চাইল্ডের কী (key) হিসেবে স্ট্রিং ভ্যালু রয়েছে, সেগুলো আভিধানিকভাবে আরোহী ক্রমে সাজানো অবস্থায় এরপরে আসে।
queryOrderedByValue
queryOrderedByValue ব্যবহার করার সময়, চাইল্ডগুলো তাদের ভ্যালু অনুসারে সাজানো হয়। সাজানোর মানদণ্ড queryOrderedByChild এর মতোই, তবে এক্ষেত্রে একটি নির্দিষ্ট চাইল্ড কী-এর ভ্যালুর পরিবর্তে নোডটির ভ্যালু ব্যবহার করা হয়।
queryOrderedByChild
queryOrderedByChild ব্যবহার করার সময়, নির্দিষ্ট চাইল্ড কী ধারণকারী ডেটা নিম্নলিখিতভাবে সাজানো হয়:
- যেসব চাইল্ড কী-এর মান নিল
nilথাকে, তাদের চাইল্ডগুলো প্রথমে আসে। - নির্দিষ্ট চাইল্ড কী-এর জন্য যেসব চাইল্ডের মান
false, সেগুলো এরপরে আসে। যদি একাধিক চাইল্ডের মানfalseহয়, তবে সেগুলোকে কী অনুসারে আভিধানিকভাবে সাজানো হয়। - নির্দিষ্ট চাইল্ড কী-এর মান '
trueহলে চাইল্ডগুলো এরপরে আসে। যদি একাধিক চাইল্ডের মান 'trueহয়, তবে সেগুলোকে কী অনুসারে আভিধানিকভাবে সাজানো হয়। - সাংখ্যিক মানযুক্ত চাইল্ডগুলো এরপর আরোহী ক্রমে আসে। যদি নির্দিষ্ট চাইল্ড নোডটির জন্য একাধিক চাইল্ডের একই সাংখ্যিক মান থাকে, তবে সেগুলোকে কী (key) অনুসারে সাজানো হয়।
- সংখ্যার পরে স্ট্রিংগুলো আসে এবং আভিধানিকভাবে আরোহী ক্রমে সাজানো হয়। যদি নির্দিষ্ট চাইল্ড নোডের জন্য একাধিক চাইল্ডের একই মান থাকে, তবে সেগুলোকে কী (key) অনুসারে আভিধানিকভাবে সাজানো হয়।
- বস্তুগুলো শেষে আসে এবং চাবি অনুসারে আভিধানিকভাবে আরোহী ক্রমে সাজানো হয়।
শ্রোতাদের বিচ্ছিন্ন করুন
আপনি যখন একটি ViewController থেকে বেরিয়ে যান, তখন Observer-রা স্বয়ংক্রিয়ভাবে ডেটা সিঙ্ক করা বন্ধ করে না। যদি কোনো Observer-কে সঠিকভাবে সরানো না হয়, তবে এটি লোকাল মেমরিতে ডেটা সিঙ্ক করতে থাকে এবং ইভেন্ট হ্যান্ডলার ক্লোজারে ক্যাপচার করা যেকোনো অবজেক্ট ধরে রাখে, যা মেমরি লিকের কারণ হতে পারে। যখন কোনো Observer-এর আর প্রয়োজন হয় না, তখন removeObserverWithHandle মেথডে এর সাথে যুক্ত FIRDatabaseHandle পাস করে এটিকে সরিয়ে ফেলুন।
যখন আপনি কোনো রেফারেন্সে একটি কলব্যাক ব্লক যোগ করেন, তখন একটি FIRDatabaseHandle ফেরত দেওয়া হয়। এই হ্যান্ডেলগুলো ব্যবহার করে কলব্যাক ব্লকটি অপসারণ করা যায়।
যদি একটি ডাটাবেস রেফারেন্সে একাধিক লিসেনার যোগ করা থাকে, তবে কোনো ইভেন্ট ঘটলে প্রতিটি লিসেনার কল করা হয়। সেই লোকেশনে ডেটা সিঙ্কিং বন্ধ করতে হলে, আপনাকে অবশ্যই removeAllObservers মেথডটি কল করে সেই লোকেশনের সমস্ত অবজারভার সরিয়ে ফেলতে হবে।
কোনো লিসেনারের উপর removeObserverWithHandle বা removeAllObservers কল করলে তার চাইল্ড নোডগুলিতে নিবন্ধিত লিসেনারগুলি স্বয়ংক্রিয়ভাবে মুছে যায় না; সেগুলিকে সরানোর জন্য আপনাকে অবশ্যই সেই রেফারেন্স বা হ্যান্ডেলগুলিরও হিসাব রাখতে হবে।