আপনি onSnapshot() পদ্ধতি ব্যবহার করে একটি ডকুমেন্ট শুনতে পারেন। আপনার প্রদত্ত কলব্যাক ব্যবহার করে একটি প্রাথমিক কল একক ডকুমেন্টের বর্তমান কন্টেন্টের সাথে সাথে একটি ডকুমেন্ট স্ন্যাপশট তৈরি করে। তারপর, প্রতিবার কন্টেন্ট পরিবর্তন হলে, আরেকটি কল ডকুমেন্ট স্ন্যাপশট আপডেট করে।
Web
import { doc, onSnapshot } from "firebase/firestore"; const unsub = onSnapshot(doc(db, "cities", "SF"), (doc) => { console.log("Current data: ", doc.data()); });
Web
db.collection("cities").doc("SF") .onSnapshot((doc) => { console.log("Current data: ", doc.data()); });
সুইফট
db.collection("cities").document("SF") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: \(error!)") return } guard let data = document.data() else { print("Document data was empty.") return } print("Current data: \(data)") }
অবজেক্টিভ-সি
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching document: %@", error); return; } NSLog(@"Current data: %@", snapshot.data); }];
Kotlin
val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: ${snapshot.data}") } else { Log.d(TAG, "Current data: null") } }
Java
final DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "Current data: " + snapshot.getData()); } else { Log.d(TAG, "Current data: null"); } } });
Dart
final docRef = db.collection("cities").doc("SF"); docRef.snapshots().listen( (event) => print("current data: ${event.data()}"), onError: (error) => print("Listen failed: $error"), );
প্রায়শই, আপনি চান যে আপনার UI কোনও Firestore ডকুমেন্ট বা সংগ্রহের বিষয়বস্তুর পরিবর্তনের প্রতিক্রিয়া দেখাক। আপনি StreamBuilder উইজেট ব্যবহার করে এটি করতে পারেন যা Firestore স্ন্যাপশট স্ট্রিম ব্যবহার করে:
class UserInformation extends StatefulWidget { @override _UserInformationState createState() => _UserInformationState(); } class _UserInformationState extends State<UserInformation> { final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance.collection('users').snapshots(); @override Widget build(BuildContext context) { return StreamBuilder<QuerySnapshot>( stream: _usersStream, builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasError) { return const Text('Something went wrong'); } if (snapshot.connectionState == ConnectionState.waiting) { return const Text("Loading"); } return ListView( children: snapshot.data!.docs .map((DocumentSnapshot document) { Map<String, dynamic> data = document.data()! as Map<String, dynamic>; return ListTile( title: Text(data['full_name']), subtitle: Text(data['company']), ); }) .toList() .cast(), ); }, ); } }
জাভা
পাইথন
সি++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener( [](const DocumentSnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { if (snapshot.exists()) { std::cout << "Current data: " << snapshot << std::endl; } else { std::cout << "Current data: null" << std::endl; } } else { std::cout << "Listen failed: " << error << std::endl; } });
নোড.জেএস
যাও
পিএইচপি
// Not supported in the PHP client libraryঐক্য
DocumentReference docRef = db.Collection("cities").Document("SF"); docRef.Listen(snapshot => { Debug.Log("Callback received document snapshot."); Debug.Log(String.Format("Document data for {0} document:", snapshot.Id)); Dictionary<string, object> city = snapshot.ToDictionary(); foreach (KeyValuePair<string, object> pair in city) { Debug.Log(String.Format("{0}: {1}", pair.Key, pair.Value)); } });
সি#
রুবি
স্থানীয় পরিবর্তনের জন্য ইভেন্ট
আপনার অ্যাপে লোকাল রাইটস তাৎক্ষণিকভাবে স্ন্যাপশট লিসেনারের সাথে যোগাযোগ করবে। এর কারণ "লেটেন্সি কম্পেনসেশন" নামক একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। আপনি যখন একটি লেখা সম্পাদন করবেন, তখন ডেটা ব্যাকএন্ডে পাঠানোর আগে আপনার লিসেনারের কাছে নতুন ডেটা পৌঁছে যাবে।
পুনরুদ্ধারকৃত নথিতে একটি metadata.hasPendingWrites বৈশিষ্ট্য রয়েছে যা নির্দেশ করে যে নথিতে এমন স্থানীয় পরিবর্তন রয়েছে যা এখনও ব্যাকএন্ডে লেখা হয়নি। আপনি আপনার স্ন্যাপশট শ্রোতা দ্বারা প্রাপ্ত ইভেন্টের উৎস নির্ধারণ করতে এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন:
Web
import { doc, onSnapshot } from "firebase/firestore"; const unsub = onSnapshot(doc(db, "cities", "SF"), (doc) => { const source = doc.metadata.hasPendingWrites ? "Local" : "Server"; console.log(source, " data: ", doc.data()); });
Web
db.collection("cities").doc("SF") .onSnapshot((doc) => { var source = doc.metadata.hasPendingWrites ? "Local" : "Server"; console.log(source, " data: ", doc.data()); });
সুইফট
db.collection("cities").document("SF") .addSnapshotListener { documentSnapshot, error in guard let document = documentSnapshot else { print("Error fetching document: \(error!)") return } let source = document.metadata.hasPendingWrites ? "Local" : "Server" print("\(source) data: \(document.data() ?? [:])") }
অবজেক্টিভ-সি
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListener:^(FIRDocumentSnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching document: %@", error); return; } NSString *source = snapshot.metadata.hasPendingWrites ? @"Local" : @"Server"; NSLog(@"%@ data: %@", source, snapshot.data); }];
Kotlin
val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener { snapshot, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } val source = if (snapshot != null && snapshot.metadata.hasPendingWrites()) { "Local" } else { "Server" } if (snapshot != null && snapshot.exists()) { Log.d(TAG, "$source data: ${snapshot.data}") } else { Log.d(TAG, "$source data: null") } }
Java
final DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } String source = snapshot != null && snapshot.getMetadata().hasPendingWrites() ? "Local" : "Server"; if (snapshot != null && snapshot.exists()) { Log.d(TAG, source + " data: " + snapshot.getData()); } else { Log.d(TAG, source + " data: null"); } } });
Dart
final docRef = db.collection("cities").doc("SF"); docRef.snapshots().listen( (event) { final source = (event.metadata.hasPendingWrites) ? "Local" : "Server"; print("$source data: ${event.data()}"); }, onError: (error) => print("Listen failed: $error"), );
জাভা
# Not yet supported in the Java client library
পাইথন
// Not yet supported in Python client library
সি++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener([](const DocumentSnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { const char* source = snapshot.metadata().has_pending_writes() ? "Local" : "Server"; if (snapshot.exists()) { std::cout << source << " data: " << snapshot.Get("name").string_value() << std::endl; } else { std::cout << source << " data: null" << std::endl; } } else { std::cout << "Listen failed: " << error << std::endl; } });
নোড.জেএস
// Not yet supported in the Node.js client libraryযাও
// Not yet supported in the Go client libraryপিএইচপি
// Not supported in the PHP client libraryঐক্য
DocumentReference docRef = db.Collection("cities").Document("SF"); docRef.Listen( snapshot => { string source = (snapshot != null && snapshot.Metadata.HasPendingWrites) ? "Local" : "Server"; string snapshotData = "null"; if (snapshot != null && snapshot.Exists) { System.Text.StringBuilder builder = new System.Text.StringBuilder(); IDictionary<string, object> dict = snapshot.ToDictionary(); foreach (var KVPair in dict) { builder.Append($"{KVPair.Key}: {KVPair.Value}\n"); } snapshotData = builder.ToString(); } Debug.Log($"{source} data: ${snapshotData}"); });
সি#
// Not yet supported in the C# client libraryরুবি
// Not yet supported in the Ruby client library
মেটাডেটা পরিবর্তনের ইভেন্ট
কোনও ডকুমেন্ট, সংগ্রহ বা কোয়েরিতে পরিবর্তন শোনার সময়, আপনার শ্রোতা যে ইভেন্টগুলি পাবেন তার গ্র্যানুলারিটি নিয়ন্ত্রণ করার জন্য আপনি বিকল্পগুলি পাস করতে পারেন।
ডিফল্টরূপে, শ্রোতাদের কেবল মেটাডেটা প্রভাবিত করে এমন পরিবর্তন সম্পর্কে অবহিত করা হয় না। আপনার অ্যাপ যখন একটি নতুন ডকুমেন্ট লেখে তখন কী ঘটে তা বিবেচনা করুন:
- নতুন ডেটার সাথে সাথেই একটি পরিবর্তন ইভেন্ট চালু হয়ে যায়। ডকুমেন্টটি এখনও ব্যাকএন্ডে লেখা হয়নি তাই "পেন্ডিং রাইটস" ফ্ল্যাগটি
true। - ডকুমেন্টটি ব্যাকএন্ডে লেখা হয়েছে।
- ব্যাকএন্ড ক্লায়েন্টকে সফল লেখার বিষয়ে অবহিত করে। ডকুমেন্ট ডেটাতে কোনও পরিবর্তন হয়নি, তবে একটি মেটাডেটা পরিবর্তন হয়েছে কারণ "মুলতুবি লেখা" পতাকাটি এখন
false।
ডকুমেন্ট বা কোয়েরি মেটাডেটা পরিবর্তনের সময় যদি আপনি স্ন্যাপশট ইভেন্টগুলি পেতে চান, তাহলে আপনার শ্রোতা সংযুক্ত করার সময় একটি listen options অবজেক্ট পাস করুন।
Web
import { doc, onSnapshot } from "firebase/firestore"; const unsub = onSnapshot( doc(db, "cities", "SF"), { includeMetadataChanges: true }, (doc) => { // ... });
Web
db.collection("cities").doc("SF") .onSnapshot({ // Listen for document metadata changes includeMetadataChanges: true }, (doc) => { // ... });
সুইফট
// Listen to document metadata. db.collection("cities").document("SF") .addSnapshotListener(includeMetadataChanges: true) { documentSnapshot, error in // ... }
অবজেক্টিভ-সি
// Listen for metadata changes. [[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"] addSnapshotListenerWithIncludeMetadataChanges:YES listener:^(FIRDocumentSnapshot *snapshot, NSError *error) { // ... }];
Kotlin
// Listen for metadata changes to the document. val docRef = db.collection("cities").document("SF") docRef.addSnapshotListener(MetadataChanges.INCLUDE) { snapshot, e -> // ... }
Java
// Listen for metadata changes to the document. DocumentReference docRef = db.collection("cities").document("SF"); docRef.addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<DocumentSnapshot>() { @Override public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirebaseFirestoreException e) { // ... } });
Dart
final docRef = db.collection("cities").doc("SF"); docRef.snapshots(includeMetadataChanges: true).listen((event) { // ... });
জাভা
// Not yet supported in the Java client libraryপাইথন
// Not yet supported in Python client library
সি++
DocumentReference doc_ref = db->Collection("cities").Document("SF"); doc_ref.AddSnapshotListener( MetadataChanges::kInclude, [](const DocumentSnapshot& snapshot, Error error, const std::string& errorMsg) { /* ... */ });
নোড.জেএস
// Not yet supported the Node.js client libraryযাও
// Not yet supported in the Go client libraryপিএইচপি
// Not supported in the PHP client libraryঐক্য
DocumentReference docRef = db.Collection("cities").Document("SF"); docRef.Listen(MetadataChanges.Include, snapshot => { // ... });
সি#
// Not yet supported in the C# client libraryরুবি
// Not yet supported in the Ruby client library
শুধুমাত্র স্থানীয় পরিবর্তনের জন্য শ্রোতাদের কনফিগার করুন
Cloud Firestore স্ন্যাপশট লিসেনার্স স্থানীয় ক্যাশে থেকে একটি প্রাথমিক স্ন্যাপশট নেয় এবং একই সাথে সার্ভার থেকে সংশ্লিষ্ট ডেটা নিয়ে আসে।
কিছু ক্ষেত্রে, আপনি সার্ভার থেকে ফলো-আপ ফেচ নাও চাইতে পারেন। ক্লায়েন্ট SDK গুলি আপনাকে স্থানীয় ক্যাশে থাকা ডেটার ক্ষেত্রে শ্রোতাদের কেবল ফায়ার করার জন্য কনফিগার করার অনুমতি দেয়। এটি আপনাকে অপ্রয়োজনীয় সার্ভার কল এবং তাদের খরচ এড়াতে সাহায্য করে এবং ক্লায়েন্ট-সাইড ক্যাশে ব্যবহার করে, যা স্থানীয় ডেটা এবং মিউটেশন প্রতিফলিত করে।
এখানে, ক্লায়েন্ট কোডে স্ন্যাপশট বিকল্পগুলি সেট করা আছে যাতে শুধুমাত্র স্থানীয় পরিবর্তনগুলি শোনা যায়।
Web
const unsubscribe = onSnapshot( doc(db, "cities", "SF"), { includeMetadataChanges: true, source:'cache' }, (documentSnapshot) => {//…} );
Web
// Not yet supported in the Web namespaced API সুইফট
// Set up listener options
let options = SnapshotListenOptions()
.withSource(ListenSource.cache)
.withIncludeMetadataChanges(true)
db.collection("cities").document("SF")
.addSnapshotListener(options: options) { documentSnapshot, error in
// ...
}
অবজেক্টিভ-সি
// Set up listener options
FIRSnapshotListenOptions *options = [[FIRSnapshotListenOptions alloc] init];
FIRSnapshotListenOptions *optionsWithSourceAndMetadata =
[[options optionsWithIncludeMetadataChanges:YES]
optionsWithSource:FIRListenSourceCache];
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"SF"]
addSnapshotListenerWithOptions:optionsWithSourceAndMetadata
listener: ^ (FIRDocumentSnapshot * snapshot, NSError * error) {
//…
}
];
Kotlin
// Set up listener options
val options = SnapshotListenOptions.Builder()
.setMetadataChanges(MetadataChanges.INCLUDE)
.setSource(ListenSource.CACHE)
.build();
db.collection("cities").document("SF")
.addSnapshotListener(options) { snapshot, error ->
//…
}
Java
// Set up listener options
SnapshotListenOptions options = new SnapshotListenOptions.Builder()
.setMetadataChanges(MetadataChanges.INCLUDE)
.setSource(ListenSource.CACHE)
.build();
db.collection("cities").document("SF").addSnapshotListener(options, new EventListener<DocumentSnapshot>() {
//…
});
Dart
// Not yet supported in this client library
জাভা
# Not yet supported in the Java client library
পাইথন
// Not yet supported in Python client library
সি++
// Not yet supported in the C++ client libraryনোড.জেএস
// Not yet supported in the Node.js client libraryযাও
// Not yet supported in the Go client libraryপিএইচপি
// Not yet supported in the PHP client libraryঐক্য
// Not yet supported in the Unity client libraryসি#
// Not yet supported in the C# client libraryরুবি
// Not yet supported in the Ruby client library
একটি সংগ্রহে একাধিক নথি শুনুন
ডকুমেন্টের মতো, আপনি কোনও কোয়েরির ফলাফল শুনতে get() এর পরিবর্তে onSnapshot() ব্যবহার করতে পারেন। এটি একটি কোয়েরি স্ন্যাপশট তৈরি করে। উদাহরণস্বরূপ, CA অবস্থা সহ ডকুমেন্টগুলি শোনার জন্য:
Web
import { collection, query, where, onSnapshot } from "firebase/firestore"; const q = query(collection(db, "cities"), where("state", "==", "CA")); const unsubscribe = onSnapshot(q, (querySnapshot) => { const cities = []; querySnapshot.forEach((doc) => { cities.push(doc.data().name); }); console.log("Current cities in CA: ", cities.join(", ")); });
Web
db.collection("cities").where("state", "==", "CA") .onSnapshot((querySnapshot) => { var cities = []; querySnapshot.forEach((doc) => { cities.push(doc.data().name); }); console.log("Current cities in CA: ", cities.join(", ")); });
সুইফট
db.collection("cities").whereField("state", isEqualTo: "CA") .addSnapshotListener { querySnapshot, error in guard let documents = querySnapshot?.documents else { print("Error fetching documents: \(error!)") return } let cities = documents.compactMap { $0["name"] } print("Current cities in CA: \(cities)") }
অবজেক্টিভ-সি
[[[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching documents: %@", error); return; } NSMutableArray *cities = [NSMutableArray array]; for (FIRDocumentSnapshot *document in snapshot.documents) { [cities addObject:document.data[@"name"]]; } NSLog(@"Current cities in CA: %@", cities); }];
Kotlin
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener { value, e -> if (e != null) { Log.w(TAG, "Listen failed.", e) return@addSnapshotListener } val cities = ArrayList<String>() for (doc in value!!) { doc.getString("name")?.let { cities.add(it) } } Log.d(TAG, "Current cites in CA: $cities") }
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "Listen failed.", e); return; } List<String> cities = new ArrayList<>(); for (QueryDocumentSnapshot doc : value) { if (doc.get("name") != null) { cities.add(doc.getString("name")); } } Log.d(TAG, "Current cites in CA: " + cities); } });
Dart
db .collection("cities") .where("state", isEqualTo: "CA") .snapshots() .listen((event) { final cities = []; for (var doc in event.docs) { cities.add(doc.data()["name"]); } print("cities in CA: ${cities.join(", ")}"); });
জাভা
পাইথন
সি++
db->Collection("cities") .WhereEqualTo("state", FieldValue::String("CA")) .AddSnapshotListener([](const QuerySnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { std::vector<std::string> cities; std::cout << "Current cities in CA: " << error << std::endl; for (const DocumentSnapshot& doc : snapshot.documents()) { cities.push_back(doc.Get("name").string_value()); std::cout << "" << cities.back() << std::endl; } } else { std::cout << "Listen failed: " << error << std::endl; } });
নোড.জেএস
যাও
পিএইচপি
// Not supported in the PHP client libraryঐক্য
Query query = db.Collection("cities").WhereEqualTo("State", "CA"); ListenerRegistration listener = query.Listen(snapshot => { Debug.Log("Callback received query snapshot."); Debug.Log("Current cities in California:"); foreach (DocumentSnapshot documentSnapshot in snapshot.Documents) { Debug.Log(documentSnapshot.Id); } });
সি#
রুবি
প্রতিবার কোয়েরির ফলাফল পরিবর্তন হলে (অর্থাৎ, যখন একটি ডকুমেন্ট যোগ করা, সরানো বা পরিবর্তন করা হয়) স্ন্যাপশট হ্যান্ডলার একটি নতুন কোয়েরি স্ন্যাপশট পাবে।
স্ন্যাপশটের মধ্যে পরিবর্তনগুলি দেখুন
সম্পূর্ণ কোয়েরি স্ন্যাপশট ব্যবহার করার পরিবর্তে, কোয়েরি স্ন্যাপশটগুলির মধ্যে কোয়েরি ফলাফলের প্রকৃত পরিবর্তনগুলি দেখা প্রায়শই কার্যকর। উদাহরণস্বরূপ, পৃথক নথি যোগ, অপসারণ এবং সংশোধন করার সময় আপনি একটি ক্যাশে বজায় রাখতে চাইতে পারেন।
Web
import { collection, query, where, onSnapshot } from "firebase/firestore"; const q = query(collection(db, "cities"), where("state", "==", "CA")); const unsubscribe = onSnapshot(q, (snapshot) => { snapshot.docChanges().forEach((change) => { if (change.type === "added") { console.log("New city: ", change.doc.data()); } if (change.type === "modified") { console.log("Modified city: ", change.doc.data()); } if (change.type === "removed") { console.log("Removed city: ", change.doc.data()); } }); });
Web
db.collection("cities").where("state", "==", "CA") .onSnapshot((snapshot) => { snapshot.docChanges().forEach((change) => { if (change.type === "added") { console.log("New city: ", change.doc.data()); } if (change.type === "modified") { console.log("Modified city: ", change.doc.data()); } if (change.type === "removed") { console.log("Removed city: ", change.doc.data()); } }); });
সুইফট
db.collection("cities").whereField("state", isEqualTo: "CA") .addSnapshotListener { querySnapshot, error in guard let snapshot = querySnapshot else { print("Error fetching snapshots: \(error!)") return } snapshot.documentChanges.forEach { diff in if (diff.type == .added) { print("New city: \(diff.document.data())") } if (diff.type == .modified) { print("Modified city: \(diff.document.data())") } if (diff.type == .removed) { print("Removed city: \(diff.document.data())") } } }
অবজেক্টিভ-সি
[[[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (snapshot == nil) { NSLog(@"Error fetching documents: %@", error); return; } for (FIRDocumentChange *diff in snapshot.documentChanges) { if (diff.type == FIRDocumentChangeTypeAdded) { NSLog(@"New city: %@", diff.document.data); } if (diff.type == FIRDocumentChangeTypeModified) { NSLog(@"Modified city: %@", diff.document.data); } if (diff.type == FIRDocumentChangeTypeRemoved) { NSLog(@"Removed city: %@", diff.document.data); } } }];
Kotlin
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener { snapshots, e -> if (e != null) { Log.w(TAG, "listen:error", e) return@addSnapshotListener } for (dc in snapshots!!.documentChanges) { when (dc.type) { DocumentChange.Type.ADDED -> Log.d(TAG, "New city: ${dc.document.data}") DocumentChange.Type.MODIFIED -> Log.d(TAG, "Modified city: ${dc.document.data}") DocumentChange.Type.REMOVED -> Log.d(TAG, "Removed city: ${dc.document.data}") } } }
Java
db.collection("cities") .whereEqualTo("state", "CA") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "listen:error", e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { switch (dc.getType()) { case ADDED: Log.d(TAG, "New city: " + dc.getDocument().getData()); break; case MODIFIED: Log.d(TAG, "Modified city: " + dc.getDocument().getData()); break; case REMOVED: Log.d(TAG, "Removed city: " + dc.getDocument().getData()); break; } } } });
Dart
db .collection("cities") .where("state", isEqualTo: "CA") .snapshots() .listen((event) { for (var change in event.docChanges) { switch (change.type) { case DocumentChangeType.added: print("New City: ${change.doc.data()}"); break; case DocumentChangeType.modified: print("Modified City: ${change.doc.data()}"); break; case DocumentChangeType.removed: print("Removed City: ${change.doc.data()}"); break; } } });
জাভা
সি++
db->Collection("cities") .WhereEqualTo("state", FieldValue::String("CA")) .AddSnapshotListener([](const QuerySnapshot& snapshot, Error error, const std::string& errorMsg) { if (error == Error::kErrorOk) { for (const DocumentChange& dc : snapshot.DocumentChanges()) { switch (dc.type()) { case DocumentChange::Type::kAdded: std::cout << "New city: " << dc.document().Get("name").string_value() << std::endl; break; case DocumentChange::Type::kModified: std::cout << "Modified city: " << dc.document().Get("name").string_value() << std::endl; break; case DocumentChange::Type::kRemoved: std::cout << "Removed city: " << dc.document().Get("name").string_value() << std::endl; break; } } } else { std::cout << "Listen failed: " << error << std::endl; } });
পাইথন
নোড.জেএস
যাও
পিএইচপি
// Not supported in the PHP client libraryঐক্য
Query query = db.Collection("cities").WhereEqualTo("State", "CA"); ListenerRegistration listener = query.Listen(snapshot => { foreach (DocumentChange change in snapshot.GetChanges()) { if (change.ChangeType == DocumentChange.Type.Added) { Debug.Log(String.Format("New city: {0}", change.Document.Id)); } else if (change.ChangeType == DocumentChange.Type.Modified) { Debug.Log(String.Format("Modified city: {0}", change.Document.Id)); } else if (change.ChangeType == DocumentChange.Type.Removed) { Debug.Log(String.Format("Removed city: {0}", change.Document.Id)); } } });
সি#
রুবি
প্রাথমিক অবস্থা সরাসরি সার্ভার থেকে আসতে পারে, অথবা স্থানীয় ক্যাশে থেকেও আসতে পারে। যদি স্থানীয় ক্যাশে কোনও অবস্থা উপলব্ধ থাকে, তাহলে কোয়েরি স্ন্যাপশটটি প্রাথমিকভাবে ক্যাশেড ডেটা দিয়ে পূর্ণ করা হবে, তারপর ক্লায়েন্ট সার্ভারের অবস্থা বুঝতে পারলে সার্ভারের ডেটা দিয়ে আপডেট করা হবে।
শ্রোতাকে আলাদা করুন
যখন আপনি আর আপনার ডেটা শুনতে আগ্রহী না হন, তখন আপনার শ্রোতাকে আলাদা করতে হবে যাতে আপনার ইভেন্ট কলব্যাকগুলি কল করা বন্ধ করে দেয়। এটি ক্লায়েন্টকে আপডেট গ্রহণের জন্য ব্যান্ডউইথ ব্যবহার বন্ধ করতে দেয়। উদাহরণস্বরূপ:
Web
import { collection, onSnapshot } from "firebase/firestore"; const unsubscribe = onSnapshot(collection(db, "cities"), () => { // Respond to data // ... }); // Later ... // Stop listening to changes unsubscribe();
Web
var unsubscribe = db.collection("cities") .onSnapshot(() => { // Respond to data // ... }); // Later ... // Stop listening to changes unsubscribe();
সুইফট
let listener = db.collection("cities").addSnapshotListener { querySnapshot, error in // ... } // ... // Stop listening to changes listener.remove()
অবজেক্টিভ-সি
id<FIRListenerRegistration> listener = [[self.db collectionWithPath:@"cities"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { // ... }]; // ... // Stop listening to changes [listener remove];
Kotlin
val query = db.collection("cities") val registration = query.addSnapshotListener { snapshots, e -> // ... } // ... // Stop listening to changes registration.remove()
Java
Query query = db.collection("cities"); ListenerRegistration registration = query.addSnapshotListener( new EventListener<QuerySnapshot>() { // ... }); // ... // Stop listening to changes registration.remove();
Dart
final collection = db.collection("cities"); final listener = collection.snapshots().listen((event) { // ... }); listener.cancel();
জাভা
পাইথন
সি++
// Add a listener Query query = db->Collection("cities"); ListenerRegistration registration = query.AddSnapshotListener( [](const QuerySnapshot& snapshot, Error error, const std::string& errorMsg) { /* ... */ }); // Stop listening to changes registration.Remove();
নোড.জেএস
যাও
পিএইচপি
// Not supported in the PHP client libraryঐক্য
listener.Stop();
সি#
রুবি
শোনার ত্রুটিগুলি পরিচালনা করুন
মাঝেমধ্যে শোনা ব্যর্থ হতে পারে — উদাহরণস্বরূপ, নিরাপত্তা অনুমতির কারণে, অথবা যদি আপনি একটি অবৈধ কোয়েরি শোনার চেষ্টা করেন। ( বৈধ এবং অবৈধ কোয়েরি সম্পর্কে আরও জানুন।) এই ব্যর্থতাগুলি মোকাবেলা করার জন্য, আপনি যখন আপনার স্ন্যাপশট শ্রোতা সংযুক্ত করবেন তখন একটি ত্রুটি কলব্যাক প্রদান করতে পারেন। একটি ত্রুটির পরে, শ্রোতা আর কোনও ইভেন্ট পাবেন না এবং আপনার শ্রোতাকে বিচ্ছিন্ন করার প্রয়োজন নেই।
Web
import { collection, onSnapshot } from "firebase/firestore"; const unsubscribe = onSnapshot( collection(db, "cities"), (snapshot) => { // ... }, (error) => { // ... });
Web
db.collection("cities") .onSnapshot((snapshot) => { // ... }, (error) => { // ... });
সুইফট
db.collection("cities") .addSnapshotListener { querySnapshot, error in if let error = error { print("Error retreiving collection: \(error)") } }
অবজেক্টিভ-সি
[[self.db collectionWithPath:@"cities"] addSnapshotListener:^(FIRQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error retreving collection: %@", error); } }];
Kotlin
db.collection("cities") .addSnapshotListener { snapshots, e -> if (e != null) { Log.w(TAG, "listen:error", e) return@addSnapshotListener } for (dc in snapshots!!.documentChanges) { if (dc.type == DocumentChange.Type.ADDED) { Log.d(TAG, "New city: ${dc.document.data}") } } }
Java
db.collection("cities") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { if (e != null) { Log.w(TAG, "listen:error", e); return; } for (DocumentChange dc : snapshots.getDocumentChanges()) { if (dc.getType() == Type.ADDED) { Log.d(TAG, "New city: " + dc.getDocument().getData()); } } } });
Dart
final docRef = db.collection("cities"); docRef.snapshots().listen( (event) => print("listener attached"), onError: (error) => print("Listen failed: $error"), );
জাভা
পাইথন
// Snippet coming soon
সি++
// Snippet coming soon.নোড.জেএস
যাও
পিএইচপি
// Not supported in the PHP client libraryঐক্য
ListenerRegistration registration = db.Collection("cities").Listen( querySnapshot => { // ... }); registration.ListenerTask.ContinueWithOnMainThread( listenerTask => { if (listenerTask.IsFaulted) { Debug.LogError($"Listen failed: {listenerTask.Exception}"); // ... // Handle the listener error. // ... } });
সি#
// Snippet coming soonরুবি
এরপর কি?
- শ্রোতাদের সহজ এবং জটিল প্রশ্নের সাথে একত্রিত করুন ।
- পুনরুদ্ধার করা নথিগুলি অর্ডার করুন এবং সীমাবদ্ধ করুন ।
- শ্রোতাদের জন্য বিলিং বুঝুন ।