Как не перезаписывать данные с помощью onDataChange?

Ситуация: я пишу приложение для Android, которое использует Google Firebase, оно имеет два основных объекта: « Пользователи и привычки : дерево данных My Firebase»

firebase-95303 habits 1 name: "Run" owner: "103694651569059705282" 2 name: "Work" owner: "103694651569059705282" 3 name: "Read" owner: "103694651569059705282" users 103694651569059705282 habitos: 0: 3 name: John Smith 

Поле «привычки» внутри моего пользователя должно иметь три идентификатора (а не только последний) от привычек выше сохраненных, поскольку он является владельцем.

Метод, который я использую для их добавления, следующий:

 fun addHabit(userId:String, name: String){ userRef.child("/"+userId).addListenerForSingleValueEvent(object:ValueEventListener { override fun onDataChange(p0: DataSnapshot?) { generatedIdHabit = generatedIdHabit + 1 var habitHash = HashMap<String, Habit>() habitHash.put(generatedIdHabit.toString(), Habit(name, userId)) habitRef.updateChildren(habitHash as Map<String, Habit>) var userTemp = p0?.getValue<User>(User::class.java)!! userTemp.addHabit(generatedIdHabit) addUser(userTemp) } override fun onCancelled(p0: DatabaseError?) { //Ignore } }) } 

Я тестировал это:

  • Сгенерированный счетчик счетчиков увеличивается до нуля, он идет от 1 до 3 без каких-либо проблем.
  • Три привычки сохраняются в базе данных в порядке, как вы можете видеть в файле JSON. Таким образом, это означает, что код выполняется три раза, когда я вызываю их в методе onCreate ().
  • Один за другим привычные идентификаторы хранятся в поле «habitos» объекта UserTemp пользователя, они просто перезаписывают друг друга.

Наконец, метод, который я использую в классе User для хранения списка привычек:

 class User(var name : String = "", var habitos : ArrayList<String> = ArrayList<String>()){ fun addHabit(id:Int){ habitos.add(id.toString()) } }