Это моя база данных firebase. Здесь в первом узле у меня есть дочерний элемент Был там, а во втором - нет. Я хочу проверить, существует ли этот Был там, и если не создать его, и если он существует, как получить его просто, без какой-либо модели или обратных вызовов? Это возможно?
Я пробовал использовать ValueEventListener, но он возвращает результат только в том случае, если данные добавляются или изменяются. Я хочу просто читать данные.
Измените свой вопрос, чтобы показать код, который вы пробовали, и объяснить, почему он не соответствует вашим потребностям. Проблема, которую вы сейчас описываете, звучит совсем иначе, чем то, что вы написали в своем вопросе до сих пор.
Примечание: вы не можете читать какие-либо данные без обратного звонка.
Теперь вы должны понять разницу между обратными вызовами в firebase, их 3 (и все эти 3 считаются считывателями данных):
Ребенок добавил:
Срабатывает при добавлении ребенка. (Это не то, что вам нужно).
Слушатель значимых событий:
Срабатывает при добавлении или изменении дочернего элемента. (Это не то, что вам нужно).
Слушатель для однозначного события:
Срабатывает только после того, как вы его прикрепите, и больше не срабатывает (это то, что вам нужно).
Итак, как вы теперь видите, когда вам нужно просто прочитать данные, вы должны вызвать Listener for single value event.
Пример:
Допустим, вы хотите проверить, существует ли BeenThere под определенным случайным идентификатором, вы должны сделать это:
//this is a method that you call when you need to read the node and do the check.
public void checkBeenThere(String random_id){
DatabaseReference places_ref = FirebaseDatabase.getInstance().getReference().child("Places");
places_ref.child(random_id).addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot datasnapshot){
//check if Been there exist
if (datasnapshot.hasChild("BeenThere")){
//been there is found
//get the value of been there (THIS IS THE EDIT***).
int been_there = datasnapshot.child("BeenThere").getValue(Integer.class);
}else{
//been there is not found
//add it under the specific random id
places_ref.child(random_id).child("BeenThere").setValue(0);
}
}
@Override
public void onCnacelled(DatabaseError error){
}
});
}
Если вас смущает random_id, это просто тот идентификатор, который у вас есть в структуре вашей базы данных (например: ChIJZZ .........), вам нужно передать этот идентификатор, чтобы проверить, существует ли под ним.
Итак, скажем, я хочу проверить, существует ли под ChIJZZ .........., я делаю это:
//you must type the whole id, I added .... because it is long.
checkBeenThere("ChIJZZ_sM.......");
Я попробую это и сообщу! Спасибо за уделенное время и ответ :)
Я понял. Если он есть, я могу проверить, есть ли BeenTherr, и, если нет, установить его в 0. Но как прочитать эти данные? dataSnapshot.child("BeenThere").getValue() Я попробовал и привел к ошибке.
@BikramNath Я обновил код, чтобы вы могли получить значение (BeenThere). Редактирование находится под комментарием, который включает (ЭТО РЕДАКТИРОВАНИЕ **) в методе onDataChange ().
Какие вы замечательные люди! Это прекрасно работает. Я попробовал и преуспел, используя беспорядочный метод, получая данные в виде строки, а затем конвертируя их в int: D Спасибо, чувак :)
Все API Firebase, которые получают данные из базы данных, включают обратные вызовы. Этого нельзя избежать.