Home > Mobile >  Extract Data from firebase
Extract Data from firebase

Time:12-14

Unable to extract information from the datasnapshot received from firebase.

Currently, I am able to get the dataSnapshot from firebase, but I am having problems extracting the information from it.

In the example below I have a lobby with the code "81MUB" and inside I have a list of players (only using one player in the example). Data from FireBase

{
"81MUB": [
    {
      "name": "Alejandro",
      "points": 0
    }
  ]
}

Data Class

data class Player(
    val name: String,
    val points: Int
)

Listener

fun getCode(): String {
    val index = ('A'..'Z')   ('1'..'9')

    var code = ""

    for (i in 0..4){
        code  = index[Random().nextInt(index.size)]
    }

    return code
}

class MviewModel : ViewModel() {
    private val _Players: MutableLiveData<MutableList<Player>> =
        MutableLiveData(mutableListOf<Player>(Player("Alejandro", 0)))
    private var _LobbyCode: String = ""
    private val dataBase = FirebaseDatabase.getInstance()

    fun getPlayer(): MutableLiveData<MutableList<Player>> = _Players

    fun createLobby() {
        _LobbyCode = getCode()
    }

    fun listener() {
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message

            }
        }

        dataBase.reference.child(_LobbyCode).addValueEventListener(postListener)
    }
}

Any tips?

CodePudding user response:

Each time you call getCode() you are generating a new random code. When reading data, you always use the exact same code that exists in the database. So in code, it should look like this:

val db = Firebase.database.reference
val codeRef = db.child("81MUB")
codeRef.get().addOnCompleteListener {
    if (it.isSuccessful) {
        val snapshot = it.result
        val name = snapshot.child("name").getValue(String::class.java)
        val points = snapshot.child("points").getValue(Long::class.java)
        Log.d("TAG", "$name/$points")
    } else {
        Log.d("TAG", error.getMessage()) //Never ignore potential errors!
    }
}

The result in the logcat will be:

Alejandro/0

If you however want to map the 81MUB node into an object of type Player, then your data class should look like this:

data class Player(
    val name: String? = null,
    val points: Int? = null
)

And in code:

val db = Firebase.database.reference
val codeRef = db.child("81MUB")
codeRef.get().addOnCompleteListener {
    if (it.isSuccessful) {
        val snapshot = it.result
        val player = snapshot.getValue(Player::class.java)
        Log.d("TAG", "${player.name}/${player.points}")
    } else {
        Log.d("TAG", error.getMessage()) //Never ignore potential errors!
    }
}

Which will produce the exact same output as above.

You might also take into consideration, using the DatabaseReference#push() method which:

Create a reference to an auto-generated child location. The child key is generated client-side and incorporates an estimate of the server's time for sorting purposes.

Instead of using your codes.

  • Related