অ্যান্ড্রয়েডে ডেটার তালিকা নিয়ে কাজ করুন

এই ডকুমেন্টটি Firebase-এ ডেটা তালিকা নিয়ে কাজ করার বিষয়ে আলোচনা করে। Firebase ডেটা পড়া এবং লেখার মূল বিষয়গুলি জানতে Android-এ ডেটা পড়ুন এবং লিখুন দেখুন।

একটি ডাটাবেস রেফারেন্স পান

ডাটাবেস থেকে ডেটা পড়তে এবং লিখতে, আপনার DatabaseReference এর একটি উদাহরণ প্রয়োজন:

Kotlin

private lateinit var database: DatabaseReference
// ...
database = Firebase.database.reference

Java

private DatabaseReference mDatabase;
// ...
mDatabase = FirebaseDatabase.getInstance().getReference();

পড়ুন এবং লিখুন তালিকা

তথ্যের তালিকায় যুক্ত করুন

মাল্টিইউজার অ্যাপ্লিকেশনের তালিকায় ডেটা যোগ করার জন্য push() পদ্ধতি ব্যবহার করুন। নির্দিষ্ট Firebase রেফারেন্সে নতুন চাইল্ড যোগ করার সময় push() পদ্ধতিটি একটি অনন্য কী তৈরি করে। তালিকার প্রতিটি নতুন উপাদানের জন্য এই স্বয়ংক্রিয়ভাবে তৈরি কীগুলি ব্যবহার করে, একাধিক ক্লায়েন্ট লেখার দ্বন্দ্ব ছাড়াই একই সময়ে একই স্থানে শিশুদের যোগ করতে পারে। push() দ্বারা তৈরি অনন্য কীটি একটি টাইমস্ট্যাম্পের উপর ভিত্তি করে তৈরি করা হয়, তাই তালিকার আইটেমগুলি স্বয়ংক্রিয়ভাবে কালানুক্রমিকভাবে সাজানো হয়।

আপনি push() পদ্ধতি দ্বারা ফেরত আসা নতুন ডেটার রেফারেন্স ব্যবহার করে চাইল্ডের অটো-জেনারেটেড কী বা সেট ডেটার মান পেতে পারেন। push() রেফারেন্সে getKey() কল করলে অটো-জেনারেটেড কীর মান ফেরত আসে।

আপনার ডেটা স্ট্রাকচার সমতলকরণ সহজ করতে আপনি এই স্বয়ংক্রিয়ভাবে তৈরি কীগুলি ব্যবহার করতে পারেন। আরও তথ্যের জন্য, ডেটা ফ্যান-আউট উদাহরণটি দেখুন।

শিশুদের ঘটনা শুনুন

তালিকার সাথে কাজ করার সময়, আপনার অ্যাপ্লিকেশনটি একক বস্তুর জন্য ব্যবহৃত মান ইভেন্টের পরিবর্তে চাইল্ড ইভেন্টগুলি শোনা উচিত।

push() পদ্ধতির মাধ্যমে নতুন চাইল্ড যোগ করা অথবা updateChildren() পদ্ধতির মাধ্যমে আপডেট করা কোন শিশু, এই ধরণের অপারেশনের ফলে নোডের বাচ্চাদের সাথে ঘটে যাওয়া নির্দিষ্ট ক্রিয়াকলাপের প্রতিক্রিয়ায় চাইল্ড ইভেন্টগুলি ট্রিগার করা হয়। এই প্রতিটি একসাথে একটি ডাটাবেসের একটি নির্দিষ্ট নোডে পরিবর্তন শোনার জন্য কার্যকর হতে পারে।

DatabaseReference এ চাইল্ড ইভেন্টগুলি শোনার জন্য, একটি ChildEventListener সংযুক্ত করুন:

শ্রোতা ইভেন্ট কলব্যাক সাধারণ ব্যবহার
ChildEventListener onChildAdded() আইটেমের তালিকা পুনরুদ্ধার করুন অথবা আইটেমের তালিকায় সংযোজনের জন্য শুনুন। এই কলব্যাকটি প্রতিটি বিদ্যমান চাইল্ডের জন্য একবার ট্রিগার করা হয় এবং তারপর প্রতিবার যখন একটি নতুন চাইল্ড নির্দিষ্ট পাথে যোগ করা হয় তখন আবার শুরু হয়। লিসেনারের কাছে পাঠানো DataSnapshot নতুন চাইল্ডের ডেটা থাকে।
onChildChanged() তালিকার আইটেমগুলিতে পরিবর্তনগুলি শুনুন। চাইল্ড নোডের ডিসেন্ডেন্টগুলিতে যেকোনো পরিবর্তন সহ, যেকোনো সময় এই ইভেন্টটি কার্যকর হয়ে যায়। ইভেন্ট লিসেনারের কাছে পাঠানো DataSnapshot চাইল্ডের আপডেট করা ডেটা থাকে।
onChildRemoved() তালিকা থেকে আইটেমগুলি সরানো হচ্ছে কিনা তা শুনুন। ইভেন্ট কলব্যাকে পাঠানো DataSnapshot সরানো চাইল্ডের ডেটা রয়েছে।
onChildMoved() একটি ক্রমানুসার তালিকার আইটেমের ক্রম পরিবর্তনের জন্য শুনুন। যখনই onChildChanged() কলব্যাকটি কোনও আপডেটের মাধ্যমে ট্রিগার করা হয় যার ফলে শিশুটির পুনঃক্রম তৈরি হয়, তখনই এই ইভেন্টটি ট্রিগার হয়। এটি orderByChild বা orderByValue দিয়ে ক্রমানুসারে থাকা ডেটার সাথে ব্যবহৃত হয়।

উদাহরণস্বরূপ, একটি সোশ্যাল ব্লগিং অ্যাপ একটি পোস্টের মন্তব্যের কার্যকলাপ পর্যবেক্ষণ করতে এই পদ্ধতিগুলি একসাথে ব্যবহার করতে পারে, যেমনটি নীচে দেখানো হয়েছে:

Kotlin

val childEventListener = object : ChildEventListener {
    override fun onChildAdded(dataSnapshot: DataSnapshot, previousChildName: String?) {
        Log.d(TAG, "onChildAdded:" + dataSnapshot.key!!)

        // A new comment has been added, add it to the displayed list
        val comment = dataSnapshot.getValue<Comment>()

        // ...
    }

    override fun onChildChanged(dataSnapshot: DataSnapshot, previousChildName: String?) {
        Log.d(TAG, "onChildChanged: ${dataSnapshot.key}")

        // A comment has changed, use the key to determine if we are displaying this
        // comment and if so displayed the changed comment.
        val newComment = dataSnapshot.getValue<Comment>()
        val commentKey = dataSnapshot.key

        // ...
    }

    override fun onChildRemoved(dataSnapshot: DataSnapshot) {
        Log.d(TAG, "onChildRemoved:" + dataSnapshot.key!!)

        // A comment has changed, use the key to determine if we are displaying this
        // comment and if so remove it.
        val commentKey = dataSnapshot.key

        // ...
    }

    override fun onChildMoved(dataSnapshot: DataSnapshot, previousChildName: String?) {
        Log.d(TAG, "onChildMoved:" + dataSnapshot.key!!)

        // A comment has changed position, use the key to determine if we are
        // displaying this comment and if so move it.
        val movedComment = dataSnapshot.getValue<Comment>()
        val commentKey = dataSnapshot.key

        // ...
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Log.w(TAG, "postComments:onCancelled", databaseError.toException())
        Toast.makeText(
            context,
            "Failed to load comments.",
            Toast.LENGTH_SHORT,
        ).show()
    }
}
databaseReference.addChildEventListener(childEventListener)

Java

ChildEventListener childEventListener = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());

        // A new comment has been added, add it to the displayed list
        Comment comment = dataSnapshot.getValue(Comment.class);

        // ...
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey());

        // A comment has changed, use the key to determine if we are displaying this
        // comment and if so displayed the changed comment.
        Comment newComment = dataSnapshot.getValue(Comment.class);
        String commentKey = dataSnapshot.getKey();

        // ...
    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey());

        // A comment has changed, use the key to determine if we are displaying this
        // comment and if so remove it.
        String commentKey = dataSnapshot.getKey();

        // ...
    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey());

        // A comment has changed position, use the key to determine if we are
        // displaying this comment and if so move it.
        Comment movedComment = dataSnapshot.getValue(Comment.class);
        String commentKey = dataSnapshot.getKey();

        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "postComments:onCancelled", databaseError.toException());
        Toast.makeText(mContext, "Failed to load comments.",
                Toast.LENGTH_SHORT).show();
    }
};
databaseReference.addChildEventListener(childEventListener);

মূল্যবান ঘটনাগুলি শুনুন

যদিও ChildEventListener ব্যবহার করা ডেটা তালিকা পড়ার জন্য প্রস্তাবিত উপায়, এমন কিছু পরিস্থিতি রয়েছে যেখানে ValueEventListener একটি তালিকার রেফারেন্সের সাথে সংযুক্ত করা কার্যকর।

ডেটার তালিকার সাথে একটি ValueEventListener সংযুক্ত করলে ডেটার সম্পূর্ণ তালিকাটি একটি একক DataSnapshot হিসাবে ফিরে আসবে, যা আপনি তারপর পৃথক শিশু অ্যাক্সেস করার জন্য লুপ করতে পারেন।

এমনকি যখন কোয়েরির জন্য শুধুমাত্র একটি মিল থাকে, তখনও স্ন্যাপশটটি একটি তালিকা হিসেবে থাকে; এতে কেবল একটি আইটেম থাকে। আইটেমটি অ্যাক্সেস করতে, আপনাকে ফলাফলটি লুপ করে দেখতে হবে:

Kotlin

// My top posts by number of stars
myTopPostsQuery.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (postSnapshot in dataSnapshot.children) {
            // TODO: handle the post
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        // ...
    }
})

Java

// My top posts by number of stars
myTopPostsQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
            // TODO: handle the post
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
});

এই প্যাটার্নটি তখন কার্যকর হতে পারে যখন আপনি একটি তালিকার সমস্ত শিশুকে একটি একক অপারেশনে আনতে চান, অতিরিক্ত onChildAdded ইভেন্ট শোনার পরিবর্তে।

শ্রোতাদের আলাদা করুন

আপনার Firebase ডাটাবেস রেফারেন্সে removeEventListener() পদ্ধতিটি কল করে কলব্যাকগুলি সরানো হয়।

যদি কোনও শ্রোতাকে কোনও ডেটা লোকেশনে একাধিকবার যুক্ত করা হয়, তবে প্রতিটি ইভেন্টের জন্য এটি একাধিকবার কল করা হয় এবং এটি সম্পূর্ণরূপে অপসারণ করতে আপনাকে একই সংখ্যক বার এটি বিচ্ছিন্ন করতে হবে।

প্যারেন্ট লিসেনারের উপর removeEventListener() কল করলে তার চাইল্ড নোডে নিবন্ধিত লিসেনারের উপর স্বয়ংক্রিয়ভাবে কল করা হয় না; কলব্যাকটি সরানোর জন্য যেকোনো চাইল্ড লিসেনারের উপর removeEventListener() কল করা আবশ্যক।

ডেটা বাছাই এবং ফিল্টার করা

আপনি Realtime Database Query ক্লাস ব্যবহার করে কী, মান বা সন্তানের মান অনুসারে সাজানো ডেটা পুনরুদ্ধার করতে পারেন। আপনি বাছাই করা ফলাফলকে নির্দিষ্ট সংখ্যক ফলাফল বা কী বা মানের পরিসরে ফিল্টার করতে পারেন।

ডেটা সাজান

সাজানো ডেটা পুনরুদ্ধার করতে, ফলাফল কীভাবে সাজানো হবে তা নির্ধারণ করার জন্য ক্রম-দ্বারা পদ্ধতিগুলির একটি নির্দিষ্ট করে শুরু করুন:

পদ্ধতি ব্যবহার
orderByChild() একটি নির্দিষ্ট চাইল্ড কী বা নেস্টেড চাইল্ড পাথের মান অনুসারে ফলাফলগুলি সাজান।
orderByKey() চাইল্ড কী দ্বারা ফলাফল সাজান।
orderByValue() শিশু মান অনুসারে ফলাফল সাজান।

আপনি একবারে শুধুমাত্র একটি অর্ডার-বাই মেথড ব্যবহার করতে পারবেন। একই কোয়েরিতে একাধিকবার অর্ডার-বাই মেথড কল করলে একটি ত্রুটি দেখা দেয়।

নিচের উদাহরণটি দেখায় যে কীভাবে আপনি একজন ব্যবহারকারীর শীর্ষ পোস্টের তালিকা তাদের তারকা সংখ্যা অনুসারে সাজানোর মাধ্যমে পুনরুদ্ধার করতে পারেন:

Kotlin

// My top posts by number of stars
val myUserId = uid
val myTopPostsQuery = databaseReference.child("user-posts").child(myUserId)
    .orderByChild("starCount")

myTopPostsQuery.addChildEventListener(object : ChildEventListener {
    // TODO: implement the ChildEventListener methods as documented above
    // ...
})

Java

// My top posts by number of stars
String myUserId = getUid();
Query myTopPostsQuery = databaseReference.child("user-posts").child(myUserId)
        .orderByChild("starCount");
myTopPostsQuery.addChildEventListener(new ChildEventListener() {
    // TODO: implement the ChildEventListener methods as documented above
    // ...
});

এটি এমন একটি কোয়েরি সংজ্ঞায়িত করে যা একটি চাইল্ড লিসেনারের সাথে মিলিত হলে, ক্লায়েন্টকে ডাটাবেসের পাথ থেকে ব্যবহারকারীর পোস্টগুলির সাথে তাদের ব্যবহারকারী আইডির উপর ভিত্তি করে সিঙ্ক্রোনাইজ করে, প্রতিটি পোস্ট কতগুলি স্টার পেয়েছে তার সংখ্যা অনুসারে। ইনডেক্স কী হিসাবে আইডি ব্যবহার করার এই কৌশলটিকে ডেটা ফ্যান আউট বলা হয়, আপনি এটি সম্পর্কে আরও পড়তে পারেন স্ট্রাকচার ইওর ডাটাবেস

orderByChild() পদ্ধতিতে কল করার মাধ্যমে ফলাফলগুলি কোন চাইল্ড কী অনুসারে সাজানো হবে তা নির্দিষ্ট করা হয়। এই ক্ষেত্রে, পোস্টগুলি তাদের নিজ নিজ "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 কী-এর অধীনে নেস্টেড মান অনুসারে সাজাতে পারি, আমাদের orderByChild() কলে নেস্টেড চাইল্ডের আপেক্ষিক পথ নির্দিষ্ট করে।

Kotlin

// Most viewed posts
val myMostViewedPostsQuery = databaseReference.child("posts")
    .orderByChild("metrics/views")
myMostViewedPostsQuery.addChildEventListener(object : ChildEventListener {
    // TODO: implement the ChildEventListener methods as documented above
    // ...
})

Java

// Most viewed posts
Query myMostViewedPostsQuery = databaseReference.child("posts")
        .orderByChild("metrics/views");
myMostViewedPostsQuery.addChildEventListener(new ChildEventListener() {
    // TODO: implement the ChildEventListener methods as documented above
    // ...
});

অন্যান্য ডেটা টাইপ কীভাবে সাজানো হয় সে সম্পর্কে আরও তথ্যের জন্য, কোয়েরি ডেটা কীভাবে সাজানো হয় তা দেখুন।

ডেটা ফিল্টার করা হচ্ছে

ডেটা ফিল্টার করার জন্য, আপনি একটি কোয়েরি তৈরি করার সময় যেকোনো সীমা বা পরিসর পদ্ধতিকে একটি অর্ডার-বাই পদ্ধতির সাথে একত্রিত করতে পারেন।

পদ্ধতি ব্যবহার
limitToFirst() ফলাফলের ক্রমানুসারে তালিকার শুরু থেকে ফিরে আসার জন্য সর্বোচ্চ সংখ্যক আইটেম সেট করে।
limitToLast() ক্রমানুসারে ফলাফলের তালিকার শেষ থেকে ফিরে আসার জন্য সর্বোচ্চ সংখ্যক আইটেম সেট করে।
startAt() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে বড় বা সমান আইটেমগুলি ফেরত দিন।
startAfter() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে বড় আইটেমগুলি ফেরত দিন।
endAt() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে কম বা সমান আইটেম ফেরত দিন।
endBefore() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের চেয়ে কম আইটেম ফেরত দিন।
equalTo() নির্বাচিত অর্ডার-বাই পদ্ধতির উপর নির্ভর করে নির্দিষ্ট কী বা মানের সমান আইটেম ফেরত দিন।

অর্ডার-বাই মেথডের বিপরীতে, আপনি একাধিক লিমিট বা রেঞ্জ ফাংশন একত্রিত করতে পারেন। উদাহরণস্বরূপ, আপনি startAt() এবং endAt() মেথডগুলিকে একত্রিত করে ফলাফলগুলিকে একটি নির্দিষ্ট রেঞ্জের মানের মধ্যে সীমাবদ্ধ করতে পারেন।

এমনকি যখন কোয়েরির জন্য শুধুমাত্র একটি মিল থাকে, তখনও স্ন্যাপশটটি একটি তালিকা হিসেবে থাকে; এতে কেবল একটি আইটেম থাকে। আইটেমটি অ্যাক্সেস করতে, আপনাকে ফলাফলটি লুপ করে দেখতে হবে:

Kotlin

// My top posts by number of stars
myTopPostsQuery.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (postSnapshot in dataSnapshot.children) {
            // TODO: handle the post
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        // ...
    }
})

Java

// My top posts by number of stars
myTopPostsQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
            // TODO: handle the post
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
});

ফলাফলের সংখ্যা সীমিত করুন

আপনি limitToFirst() এবং limitToLast() পদ্ধতি ব্যবহার করে একটি নির্দিষ্ট কলব্যাকের জন্য সর্বাধিক কতগুলি শিশু সিঙ্ক করা হবে তা নির্ধারণ করতে পারেন। উদাহরণস্বরূপ, যদি আপনি limitToFirst() ব্যবহার করে ১০০ এর সীমা নির্ধারণ করেন, তাহলে আপনি প্রাথমিকভাবে কেবল ১০০ টি onChildAdded() কলব্যাক পাবেন। যদি আপনার Firebase ডাটাবেসে ১০০ টিরও কম আইটেম সংরক্ষিত থাকে, তাহলে প্রতিটি আইটেমের জন্য একটি onChildAdded() কলব্যাক চালু হবে।

আইটেম পরিবর্তনের সাথে সাথে, আপনি কোয়েরিতে প্রবেশ করানো আইটেমগুলির জন্য onChildAdded() কলব্যাক এবং বাদ পড়া আইটেমগুলির জন্য onChildRemoved() কলব্যাক পাবেন যাতে মোট সংখ্যা ১০০-তে থাকে।

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে example blogging app সমস্ত ব্যবহারকারীর দ্বারা সাম্প্রতিক ১০০টি পোস্টের তালিকা পুনরুদ্ধার করার জন্য একটি কোয়েরি সংজ্ঞায়িত করে:

Kotlin

// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys.
databaseReference.child("posts").limitToFirst(100)

Java

// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
Query recentPostsQuery = databaseReference.child("posts")
        .limitToFirst(100);

এই উদাহরণটি শুধুমাত্র একটি কোয়েরি সংজ্ঞায়িত করে, প্রকৃতপক্ষে ডেটা সিঙ্ক্রোনাইজ করার জন্য এটিতে একটি সংযুক্ত শ্রোতা থাকা প্রয়োজন।

কী বা মান অনুসারে ফিল্টার করুন

আপনি startAt() , startAfter() , endAt() , endBefore() , এবং equalTo() ব্যবহার করে কোয়েরির জন্য নির্বিচারে শুরু, শেষ এবং সমতুল্য বিন্দু নির্বাচন করতে পারেন। এটি ডেটা পৃষ্ঠাঙ্কন করার জন্য বা নির্দিষ্ট মান সম্পন্ন শিশুদের সাথে আইটেম খুঁজে বের করার জন্য কার্যকর হতে পারে।

কোয়েরি ডেটা কীভাবে সাজানো হয়

এই বিভাগটি ব্যাখ্যা করে যে Query ক্লাসের প্রতিটি ক্রম-দ্বারা পদ্ধতি অনুসারে ডেটা কীভাবে সাজানো হয়।

orderByChild

orderByChild() ব্যবহার করার সময়, নির্দিষ্ট চাইল্ড কী ধারণকারী ডেটা নিম্নরূপ সাজানো হয়:

  1. নির্দিষ্ট শিশু কী-এর জন্য null মান সহ শিশুরা প্রথমে আসে।
  2. নির্দিষ্ট শিশু কী-এর জন্য false মান সহ শিশুদের পরে আসে। যদি একাধিক শিশুদের false মান থাকে, তবে তাদের কী অনুসারে অভিধানিকভাবে সাজানো হয়।
  3. নির্দিষ্ট child key-এর জন্য true মান সম্পন্ন শিশুদের পরে আসে। যদি একাধিক শিশুদের true মান থাকে, তাহলে তাদের অভিধানিকভাবে key অনুসারে সাজানো হয়।
  4. সংখ্যাসূচক মান সম্পন্ন শিশুরা পরবর্তীতে আসে, ঊর্ধ্বক্রমানুসারে সাজানো। যদি একাধিক শিশু নির্দিষ্ট শিশু নোডের জন্য একই সংখ্যাসূচক মান ধারণ করে, তাহলে তাদের কী অনুসারে সাজানো হয়।
  5. স্ট্রিংগুলি সংখ্যার পরে আসে এবং লেক্সিকোগ্রাফিকভাবে ঊর্ধ্বক্রমানুসারে সাজানো হয়। যদি একাধিক চাইল্ড নোডের জন্য একই মান থাকে, তাহলে সেগুলিকে কী দ্বারা লেক্সিকোগ্রাফিকভাবে সাজানো হয়।
  6. বস্তুগুলি শেষে আসে এবং শব্দকোষ অনুসারে কী অনুসারে ঊর্ধ্বক্রমানুসারে সাজানো হয়।

orderByKey

আপনার ডেটা সাজানোর জন্য orderByKey() ব্যবহার করার সময়, কী অনুসারে ডেটা ঊর্ধ্বমুখী ক্রমে ফেরত পাঠানো হয়।

  1. ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায় এমন কী সহ শিশুদের প্রথমে আসে, আরোহী ক্রমে সাজানো হয়।
  2. যেসব শিশুদের কী হিসেবে স্ট্রিং মান থাকে, তারা পরবর্তীতে আসে, লেক্সিকোগ্রাফিকভাবে ঊর্ধ্বক্রমানুসারে সাজানো হয়।

orderByValue

orderByValue() ব্যবহার করার সময়, শিশুদের তাদের মান অনুসারে সাজানো হয়। অর্ডারিং মানদণ্ড orderByChild() এর মতোই, তবে নির্দিষ্ট চাইল্ড কী-এর মানের পরিবর্তে নোডের মান ব্যবহার করা হয়।

পরবর্তী পদক্ষেপ