Я создаю приложение, и мне нужно постоянно сопоставлять данные в действии. Я использую firebase для базы данных, и у меня возникают проблемы с правильным запросом. Я хочу сопоставить данные в дочернем элементе (uid) с другими данными в другом дочернем элементе (uid), в этом случае я все еще тестирую только дату.
Обновлено: мне нужно сопоставить дочерний элемент uid1 (в данном случае дату) со ВСЕМИ СУЩЕСТВУЮЩИМИ датами, доступными в «Расписаниях». Мое плохое ... предыдущий заданный вопрос был неправильным, где я сказал "сопоставление данных uid1 с данными uid2"

Вот мой код. Я думаю, что мои условия неправильные.
mInstance.getReference("Schedules").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Schedule schedule = dataSnapshot.child(uid).getValue(Schedule.class);
for(DataSnapshot data: dataSnapshot.getChildren()) {
if (dataSnapshot.child(uid).child("date").exists() && dataSnapshot.child(uid).child("date").getChildrenCount()>= 2) {
test.setText("Found Match for " + schedule.date + "," + schedule.sport + ", and " + schedule.location);
} else {
test.setText(schedule.date + schedule.sport + schedule.location);
}
}
}
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException());
}
На самом деле, я хотел сравнить даты со всеми датами в дочернем элементе расписаний. Я ошибся, объясняя свой случай. Прости.




Глядя на вашу базу данных, невозможно, чтобы ребенок («свидание») с дочерними элементами считал больше двух. Если я могу спросить, зачем это нужно?
Есть два разных подхода к решению этой проблемы.
Получите список <> всех расписаний из базы данных и просто сравните uid
или
Если вы уже знаете uid данных, которые ищете, получите данные из базы данных.
private Query queryGetSchedule;
private Query queryAllSchedule;
private ValueEventListener schedulesListener;
private ValueEventListener allSchedulesListener;
private FirebaseDatabase;
//Inside onCreate or class your are using
this.context = context; //pass in context
this.app = FirebaseApp.initializeApp(context);
this.id = myid;
if (firebaseDatabase == null) firebaseDatabase = FirebaseDatabase.getInstance();
queryGetSchedule = firebaseDatabase.getReference("Schedules").Child("key");
queryAllSchedule = firebaseDatabase.getReference().child("Schedules");
/**
* This will get you a single schedule
*/
public void getSingleSchedules()
{
if (schedulesListener == null)
{
schedulesListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get Post object and use the values to update the UI
if (dataSnapshot.exists()) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
// MainActivity.userBook = snapshot.getValue(UserBook.class);
Schedule schedule = snapshot.getValue(Schedule.class);
callback.onUserCallback(userBook);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
}
};
}
queryGetSchedule.addListenerForSingleValueEvent(schedulesListener);
}
/**
*This will get you all your schedules in a list so you can easily compare
* Let assume you are passing in schedule of interest into this method
*/
public void getAllSchedulesListener(Schedule scheduleOfInterest) {
if (allSchedulesListener == null) {
allSchedulesListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get Post object and use the values to update the UI
//Use this for list of objects passing in the type
GenericTypeIndicator<List<Schedule>> schedulesList =
new GenericTypeIndicator<List<Schedule>>() {
};
if (dataSnapshot.exists()) {
List<Schedule> mySchedulesList = dataSnapshot.getValue(schedulesList);
//after you get this full list of schedule you can compare with date as a string
for(Schedule schedule: mySchedulesList)
{
if (scheduleOfInterest.date.equals(schedule.date)
{
//found it
//do whatever here
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
}
};
}
queryAllSchedule.addListenerForSingleValueEvent(allSchedulesListener);
}
Чтобы решить эту проблему, просто используйте следующие строки кода:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidOneRef = rootRef.child("Schedules").child(uidOne);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String dateOne = ds.child("date").getValue(String.class);
Query uidTwoRef = rootRef.child("Schedules").orderByChild("date").equalTo(dateOne);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String dateTwo = ds.child("date").getValue(String.class);
Schedule schedule = dataSnapshot.getValue(Schedule.class);
if (dateOne.equals(dateTwo)) {
test.setText("Found Match for " + schedule.date + "," + schedule.sport + ", and " + schedule.location);
} else {
test.setText(schedule.date + schedule.sport + schedule.location);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
uidTwoRef.addListenerForSingleValueEvent(eventListener);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
uidOneRef.addListenerForSingleValueEvent(valueEventListener);
В котором uidOne и uidTwo - это идентификаторы пользователей, которых вы хотите проверить. Я настоятельно рекомендую вам хранить данные как timestamp, а не как строку, как объясняется здесь.
Привет, я думаю, что сделал неправильное объяснение, я хочу, чтобы код был динамическим, поэтому я могу сравнить дату (скажем, date1) с КАЖДОЙ датой, доступной в «Расписаниях».
В этом случае см. Мой обновленный ответ. Это работает?
Спасибо за помощь, но, к сожалению, это не помогло. Я получил ошибку в этой строке: DatabaseReference uidTwoRef = rootRef.child ("Расписания"). OrderByChild ("date"). EqualTo (date One); Он говорит, что это тип запроса и не может перейти к типу DatabaseReference. Я пытался настроить его, но все равно не работает.
Да, ты прав. Это должен быть Qyery, а не DatabaseReference.. См. Мой обновленный ответ. А теперь работает?
Он успешно скомпилирован, но дает мне нулевое значение для этого: test.setText (schedule.date + schedule.sport + schedule.location); Я считаю, что ссылка на базу неверна, я все еще работаю над этим.
Ошибки нет, но возвращается нулевое значение.
Если вы пытаетесь Log.d(TAG, dateTwo);, то какой выход?
Что делать, если использовать Log.d(TAG, dateOne);?
Показал 2018-12-10 15:20:24.977 11249-11249/com.sparingan D/MainMenu: 9/12/2018. Итак, dateOne верна. Но dateTwo имеет значение null.
Итак, вы хотите сравнить дату uid1 с датой uid2 в этом случае, верно?