Dot
Dot

Reputation: 25

Firebase Querying many child based on one attribute value from one of them

My Firebase storge

from the image above, I want to get all the milk powder based on the barcode of one of them

var query: Query = FirebaseDatabase.getInstance().getReference("Barcode")
                    .orderByChild("itemBarcode")
                    .equalTo(read)

where 'read' is the barcode number I only get one item, I want instead to get all the item type and wight based on barcode number like: SELECT itemWieght, itemName, itemPrice FROM barcode WHERE itemBarcode.itemType = itemType or something like this

EDIT :

here is my part of the code if that's helps

var query: Query = FirebaseDatabase.getInstance().getReference("Barcode")
                    .orderByChild("itemBarcode")
                    .equalTo(read)

                //Adapter
                query.addValueEventListener(object : ValueEventListener {
                    override fun onCancelled(p0: DatabaseError) {

                    }

                    override fun onDataChange(p0: DataSnapshot) {
                        myBarcodeArray?.clear()
                        for (r in p0.children) {
                            var infoHolder = r.getValue(BarcodeInfo::class.java)


                            myBarcodeArray!!.add(infoHolder!!)
                        }
                        val infoAdapter = BarcodeResultAdapter(applicationContext, myBarcodeArray!!)
                        view.listOfBarcodeResult.adapter = infoAdapter
                    }
                })

EDIT 2: I tried also to use 2 queries, but it shows empty results

myDataRef?.child("Barcode")?.orderByChild("itemBarcode")?.equalTo(read)?.addListenerForSingleValueEvent(object : ValueEventListener{
                    override fun onCancelled(p0: DatabaseError) {

                    }
                    override fun onDataChange(p0: DataSnapshot) {
                        var result = p0.getValue(BarcodeInfo::class.java)
                        myDataRef?.child("Barcode")?.orderByChild(result?.itemWeight.toString())?.equalTo(read)?.addValueEventListener(object : ValueEventListener{
                            override fun onCancelled(p0: DatabaseError) {
                            }
                            override fun onDataChange(p0: DataSnapshot) {
                                for (r in p0.children){
                                    var holder = r.getValue(BarcodeInfo::class.java)
                                    myBarcodeArray!!.add(holder!!)
                                }
                                val infoAdapter = BarcodeResultAdapter(applicationContext, myBarcodeArray!!)
                                view.listOfBarcodeResult.adapter = infoAdapter
                            }
                        })
                    }
                })

Upvotes: 1

Views: 66

Answers (2)

Dot
Dot

Reputation: 25

I did it by using "Kiet Phan" advice and used 2 query statement like this :

var query: Query = FirebaseDatabase.getInstance().getReference("Barcode")
                    .orderByChild("itemBarcode")
                    .equalTo(read)
                query.addValueEventListener(object : ValueEventListener {
                    override fun onCancelled(p0: DatabaseError) {}
                    override fun onDataChange(p0: DataSnapshot) {
                        myBarcodeArray?.clear()
                        for (r in p0.children) {
                            var infoHolder = r.getValue(BarcodeInfo::class.java)
                            type = infoHolder?.itemType.toString()
                        }
                        var query2: Query = FirebaseDatabase.getInstance().getReference("Barcode")
                            .orderByChild("itemType")
                            .equalTo(type)
                        query2.addValueEventListener(object : ValueEventListener{
                            override fun onCancelled(p0: DatabaseError) {}

                            override fun onDataChange(p0: DataSnapshot) {
                                for (r in p0.children) {
                                    var infoHolder = r.getValue(BarcodeInfo::class.java)
                                    type = infoHolder?.itemType.toString()
                                    myBarcodeArray!!.add(infoHolder!!)
                                }
                                val infoAdapter = BarcodeResultAdapter(applicationContext, myBarcodeArray!!)
                                view.listOfBarcodeResult.adapter = infoAdapter
                            }
                        })
                    }
                })

thanks to everyone for help

Upvotes: 0

Kiet Phan
Kiet Phan

Reputation: 44

If you want get all value inside an item (data snapshot) that mean you should catch a whole of that item so add your query to ListenerForSingleValueEvent

Reference : Query firebase data in Android

Upvotes: 1

Related Questions