База данных Firebase несколько строк в одном дочернем элементе - PullRequest
0 голосов
/ 19 мая 2019

Я работаю с FireBase в течение пары месяцев, и до сих пор у меня не было проблем до сих пор. Я использую Kotlin и моя проблема проста, но я не могу найти выход. я храню строки в базе данных: путь "/ user / friends", но я не могу изменить имя переменной, и строки перезаписывались сами. Мое решение было использовать «push ()» до «setValue ()», но с этим у меня есть следующая структура firebase:

"users": {
    "yvrYpjMwVSPBvMAvDGo26hPlWWQ2": {
        "email": "vinibarros.sp@gmail.com",
        "friends": {
            "-LfD9z6ke7FXFjxUb4td": {
                "email": "teste@gmail.com"
            },
            "-LfDA-NaAYAMoWiPhXy4": {
                "email": "teste2@gmail.com"
            }
        },
        "primeiroLogin": true,
        "stars": 0,
        "tutorialComplete": false,
        "uid": "yvrYpjMwVSPBvMAvDGo26hPlWWQ2",
        "username": "Vinicius Barros"
    }
}

в основном хеш-карты внутри hashmap ps: lol mindblow

как мне получить pushcode.value в массив?

У меня есть пользователь класса, у которого есть переменная друга, до сих пор эта переменная была напечатана как hashMap. и звонок для получения электронной почты был «user.friends.value»

это сработало, потому что был один друг ....

com.google.firebase.database.DatabaseException: не удалось преобразовать значение типа java.util.HashMap в строку

Когда я добавил более одного пользователя, я получил эту ошибку, которая ссылается на пользователя моего класса, где есть hashMap. Но FireBase дает мне другой хэш-карту вместо строки. Я думал о: hashMap<hashMap<String,String>, null>.

Я пробовал это:

друзья класса:

@Parcelize
class Friend(val hashMap: HashMap < String, String > ? ): Parcelable {
    constructor(): this(null)
}

Активность, в которой я показываю друзьям:

val ref2 = FirebaseDatabase.getInstance().getReference("/users/" + cUid + "/friends/")
ref2.addListenerForSingleValueEvent(object: ValueEventListener {
    override fun onCancelled(p0: DatabaseError) {

    }
    override fun onDataChange(p0: DataSnapshot) {
        p0.children.forEach {
            val friend = it.getValue(Friend::class.java)
            Log.d("teste", it.toString())
            if (friend != null) {
                Log.d("teste", friend.hashMap ? .values.toString())
                //friends.add(friend.hashMap?.values.toString())
            }
        }

    }

})

это возвращает ноль ....

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Решено!

После того, как попасть в / друзья я сделал это:

 var friends : ArrayList<String> = arrayListOf()

onDataChanged, где я получаю строку друга

     override fun onDataChange(p1: DataSnapshot) {
                                          p1.children.forEach { it1 ->
                                              val friend = it1.value as String

                                                  friends.add(friend)


                                          }
                                      }
0 голосов
/ 19 мая 2019

С вашим классом Friend клиент Firebase ищет JSON для каждого друга с такой структурой:

"-LfD9z6ke7FXFjxUb4td": {
    "hashMap": {
        ...
    }
},

Это потому, что вы определяете свой класс Friend со свойством hashMap следующим образом: class Friend(val hashMap: HashMap < String, String > ? ).

Чтобы прочитать текущую структуру, вам нужно определить data class следующим образом:

data class Friend (
    val email: String? = null
}

Теперь email в классе Friend соответствует свойству email в JSON. А поскольку email имеет значение по умолчанию, класс Friend будет иметь конструктор по умолчанию без аргументов, на который опирается Firebase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...