2016-03-25 3 views
1

У меня проблема с valueEvenListener на Firebase. Рассмотрите ситуацию:Обновление базы Firebase против setvalue

Firebase ref = new Firebase(Constant.BASEURL).child("myLists"); 
ref.addValueEventListener(myValueEventListener); 

Затем я пытаюсь обновить одно из значений списка с помощью updateChildren().

HashMap<String, Object> newEditionTimeHM = new HasMap<String, Object> 
newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP); 

ref.child(pushKey).updateChildren(newEditionTimeHM); 

Он обновляет, но когда мой слушатель ловит обновление, он выходит из строя отчетов «не удалось отскочить к типу» ошибка.

С моей второй попытки я создаю новый объект shoppinList с новыми значениями, которые я хочу, и нажмите его с помощью setValue().

newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP); 
ShoppingList shoppingList = new ShoppingList("Owner unknown", newEditionTimeHM); 

ref.child(pushKey).setValue(shoppingList); 

Когда мои слушатели его поймают, никаких проблем не сообщается.

В чем разница? Почему мне нужно создать совершенно новый объект, чтобы удовлетворить слушателя? Не эффективнее ли использовать updateChildren()? Искал this page для ответа, но не нашел его.

+0

Если он «не поддается отказу», то результирующие данные (onDataChange) в одном из случаев, вероятно, отличаются от других. Проверьте отладку, в чем разница и сделайте выводы. – Wukash

+0

@Wukash Я проверил. Эти два метода должны делать то же самое. Доказательство этого заключается в том, что, когда я проверяю свой конечный результат в firebase, я получаю то же самое, используя первый метод или второй. Разница заключается в том, как реагирует слушатель. –

+0

Да, я понимаю, что значения на сервере одинаковы в конечном результате. Я сказал, что вы должны проверить, в чем разница в методе слушателя, и действовать соответствующим образом. Я имею в виду, что мы не сможем изменить поведение библиотеки firebase, так что это ваш единственный вариант ... – Wukash

ответ

2

ServerValue.TIMESTAMP имеет тип Map<String, String>, поэтому я думаю, ваша структура данных в Firebase связана с этим, если ваш pushKey является "<your Firebase URL>/myLists":

"myLists": { 
    "editionTimeStamp": { 
     "timeStampKey": "timeStampValue" 
    } 
} 

Итак, если вы хотите получить TIMESTAMP значение, я предлагаю ваш первый попробуйте должны быть:

ref.child("<your Firebase URL>/myLists/editionTimeStamp/timeStampKey"); 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     String timeStampValue = (String)snapshot.getValue(); 
    } 
    @Override 
    public void onCancelled(FirebaseError firebaseError) { 
     System.out.println("The read failed: " + firebaseError.getMessage()); 
    } 
}); 

Если это не ваше решение, здесь хорошее объяснение об этой ошибке: Why do I get "Failed to bounce to type" when I turn JSON from Firebase into Java objects?
Надеюсь, что это поможет: D

0

Ok. Нашел проблему. Я понял, прочитав this page и ответ выше, что я неправильно понял, как работают слушатели firebase. Существует разница в реагировании на setValue() и updateChildren(). Обязательно проверьте, какие значения вам нужны после обновления, и соответственно используйте ChildEventListener или ValueEventListener. Жизнь снова хороша! Ура!

+0

благодарит @johny. Я запомню это. –

Смежные вопросы