Как проверить, существует ли ключ в firebase - PullRequest
0 голосов
/ 14 марта 2019

Я работаю над системой управления посещаемостью. Я хотел бы, чтобы он показывал тост-сообщение, если посещаемость пользователя уже помечена на текущую дату, в противном случае я бы хотел установить его посещаемость.

Я использую новую дату в качестве ключа посещаемости. Теперь я хочу проверить, находится ли новая дата в узле.

Вы можете увидеть формат моей базы данных на изображении ниже.

Database Image

Теперь в addValueEventListener я хотел бы проверить, доступна ли текущая дата, и загрузить посещаемость, в противном случае показать тост, указывающий, что посещаемость уже отмечена.

Как мне это сделать?

AttendRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot child : dataSnapshot.getChildren()) {

            if (child.child(date).getKey().equals(date)){
                Toast.makeText(ProfileAct.this, "Already marked", Toast.LENGTH_SHORT).show();
            }
            else {
                AttendRef.child(date).setValue("Present");
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

1 Ответ

1 голос
/ 15 марта 2019

Поскольку вы пропустили некоторую информацию в своем вопросе, я сделал следующие предположения:

  • Вы ищете посещаемость для идентификатора пользователя, хранящегося в строке userId на дату, сохраненную в строке date.
  • AttendRef - это DatabaseReference, указывающее на Users/{userId}/Attendance
  • Данная дата является единственной датой поиска и изменения для данного идентификатора пользователя.

Во-первых, я настоятельно рекомендую изменить способ хранения дат на формат ISO 8601. В Java это дается в формате "yyyy-MM-dd". Причина этого в том, что Firebase будет правильно отсортировать даты от самых старых до самых новых.

Исходя из вашего вопроса и предположений, приведенных выше, вы можете просто запросить данные в базе данных напрямую, а не загружать все данные в разделе «Посещаемость», а затем выполнять их итерацию.

SimpleDateFormat DB_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
DatabaseReference DB_ROOT_REF = FirebaseDatabase.getInstance().getReference();

String userId = "bq7TqEwgluSiNRP7FDKanHptd9C2"; // the user to lookup
String date = DB_DATE_FORMAT.format(new Date()); // save attendance for today's date

DatabaseReference AttendRef = DB_ROOT_REF.child("Users").child(userId).child("Attendance");

AttendRef.child(date).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        // If data exists, toast currently stored value. Otherwise, set value to "Present"
        if (dataSnapshot.exists()) {
            Toast.makeText(ProfileAct.this, "Already marked as '" + dataSnapshot.getValue(String.class) + "'", Toast.LENGTH_SHORT).show();
        } else {
            dataSnapshot.getRef().setValue("Present");
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        //TODO: Handle this
    }
});

В приведенном выше коде важно использовать addListenerForSingleValueEvent(...), в противном случае этот слушатель сработает сам из-за setValue(...).

Дальнейшее чтение

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