Android-এ ডেটার তালিকা নিয়ে কাজ করা

Firebase-এ ডেটার তালিকা নিয়ে কাজ করার বিষয়টি এই ডকুমেন্টে কভার করা হয়েছে। Firebase ডেটা পড়া ও লেখার প্রাথমিক বিষয়গুলি জানতে, Android-এ ডেটা পড়া ও লেখা দেখুন।

DatabaseReference পান

ডেটাবেস থেকে ডেটা পড়তে ও লিখতে, আপনার DatabaseReference-এর ইনস্ট্যান্স প্রয়োজন:

Kotlin

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

Java

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

তালিকা পড়া ও লেখা

ডেটার তালিকায় যোগ করুন

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

এই উদাহরণে, আমরা 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
    // ...
});

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

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

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

পদ্ধতি ব্যবহার
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()টি কলব্যাক পাবেন যাতে মোট সংখ্যা ১০০ থাকে।

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

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. নির্দিষ্ট চাইল্ড কী-এর জন্য true ভ্যালু সহ চাইল্ড এর পরে আসে। একাধিক চাইল্ডের ভ্যালু true হলে, সেগুলি কী অনুযায়ী লেক্সিকোগ্রাফিক্যালি সাজানো হয়।
  4. এরপর সংখ্যাবাচক মান সহ চাইল্ড আইটেম ছোট থেকে বড় ক্রমানুসারে সাজানো হয়। নির্দিষ্ট চাইল্ড নোডের জন্য একাধিক চাইল্ডের একই সংখ্যাসূচক মান থাকলে, সেগুলি 'কী' অনুযায়ী সাজানো হয়।
  5. স্ট্রিংগুলি সংখ্যার পরে আসে এবং ছোট থেকে বড় ক্রমানুসারে অভিধানের ক্রম অনুযায়ী সাজানো হয়। একাধিক চাইল্ড নোডের জন্য নির্দিষ্ট চাইল্ড নোডের ভ্যালু একই হলে, সেগুলি 'কী' অনুযায়ী লেক্সিকোগ্রাফিক্যালি সাজানো হয়।
  6. অবজেক্ট শেষে আসে এবং কী অনুযায়ী ছোট থেকে বড় ক্রমানুসারে সাজানো হয়।

orderByKey

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

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

orderByValue

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

পরবর্তী ধাপ