Firebase: как принудительно получить новые данные для одного конкретного узла.

#android #firebase #firebase-realtime-database #persistence

#Android #firebase #firebase-база данных в реальном времени #постоянство

Вопрос:

Я включил setPersistenceEnabled(true) , затем что-то произошло по ошибке, и узел, который, как предполагается, имеет дочерние элементы, теперь не;

Узел был в форме :

  Nodes : {
         concernedNode : {
                       child : "data",
                       child2 : "data"
         } 
   }
  

После ошибки concernedNode изменился на :

 concernedNode : true
  

И в java я получаю эти данные следующим образом :

 concernedNodePojo pojo = dataSnapshot.getValue(concernedNodePojo.class);
  

Как вы можете видеть, если concernedNode теперь является логическим значением, это вызывает исключение, в котором concernedNodePojo не может быть преобразован в Boolean.

Теперь проблема в том, что это уже в кэше, если setPersistenceEnabled(false) все будет работать нормально, но затем, если setPersistenceEnabled(true) , приложение отключается, потому что нет способа удалить автономные данные.

Я попытался setPersistenceEnabled(false) затем извлечь новые данные, чтобы можно было перезаписать автономные данные, но это не тот случай. Данные в автономном режиме проверяются, и приложение завершает работу.

Ответ №1:

Самый простой способ — вручную удалить данные приложения или переустановить приложение.

Программно лучше всего поддерживать сохраняемость включенной и извлекать данные без их синтаксического анализа в вашем POJO. Просто подключите прослушиватель, который ничего не делает в своем onDataChange() или, если вам интересно посмотреть, есть ли у него новые данные, анализирует снимок без преобразования его в concernedNodePojo .

Например:

 public void onDataChange(DataSnapshot snapshot) {
    System.out.println("Got " snapshot.getKey());
    System.out.println("Got " snapshot.child("child").getValue());
}
  

Комментарии:

1. На самом деле мне придется написать пользовательский блок кода, подобный тому, который вы опубликовали, поскольку я использовал FirebaseListAdapter, но использовал пользовательский код в качестве примера по этому вопросу.