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

এই ডকুমেন্টে ফায়ারবেসে ডেটার তালিকা নিয়ে কাজ করার পদ্ধতি আলোচনা করা হয়েছে। ফায়ারবেস ডেটা পড়া এবং লেখার প্রাথমিক বিষয়গুলো জানতে অ্যান্ড্রয়েডে ডেটা পড়া এবং লেখা দেখুন।

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

ডাটাবেস থেকে ডেটা পড়তে ও লিখতে, আপনার 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 ক্লাস ব্যবহার করে কী, ভ্যালু, বা চাইল্ড ভ্যালু অনুসারে সাজানো ডেটা পুনরুদ্ধার করতে পারেন। এছাড়াও আপনি সাজানো ফলাফলকে একটি নির্দিষ্ট সংখ্যক ফলাফলে অথবা কী বা ভ্যালুর একটি পরিসরে ফিল্টার করতে পারেন।

ডেটা সাজান

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

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

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

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

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",
  }
},

এই উদাহরণে, আমরা orderByChild() কলে নেস্টেড চাইল্ডের রিলেটিভ পাথ উল্লেখ করে metrics কী-এর অধীনে থাকা ভ্যালু অনুসারে আমাদের লিস্টের এলিমেন্টগুলোকে সাজাতে পারি।

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
    // ...
});

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

ডেটা ফিল্টার করা

কোয়েরি তৈরি করার সময় ডেটা ফিল্টার করতে আপনি limit বা range মেথডের যেকোনোটির সাথে order-by মেথড ব্যবহার করতে পারেন।

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

order-by মেথডগুলোর থেকে ভিন্নভাবে, আপনি একাধিক limit বা range ফাংশন একত্রিত করতে পারেন। উদাহরণস্বরূপ, ফলাফলকে একটি নির্দিষ্ট পরিসরের মধ্যে সীমাবদ্ধ করতে আপনি 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() কলব্যাক পাবেন, যাতে মোট সংখ্যা ১০০-তেই স্থির থাকে।

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

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 ক্লাসের প্রতিটি order-by মেথড ব্যবহার করে কীভাবে ডেটা সর্ট করা হয় তা ব্যাখ্যা করা হয়েছে।

orderByChild

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

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

orderByKey

orderByKey() ব্যবহার করে ডেটা সর্ট করার সময়, ডেটা কী (key) অনুসারে আরোহী ক্রমে ফেরত আসে।

  1. যেসব চাইল্ডের কী-কে ৩২-বিট পূর্ণসংখ্যা হিসেবে পার্স করা যায়, সেগুলো আরোহী ক্রমে প্রথমে আসে।
  2. যেসব চাইল্ডের কী (key) হিসেবে স্ট্রিং ভ্যালু রয়েছে, সেগুলো আভিধানিকভাবে আরোহী ক্রমে সাজানো অবস্থায় এরপরে আসে।

orderByValue

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

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