Я пытаюсь получить во времени следующее:

Где известное значение - это текущий токен аутентифицированного пользователя, а неизвестное значение - это пользователь, который был создан ранее из серверной среды.
mDatabase = FirebaseDatabase.getInstance().getReference("users");
mDatabase.child("users").child(user.getUid());
mDatabase.child(user.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
GenericTypeIndicator<Map<String, Object>> t = new GenericTypeIndicator<Map<String, Object>>() {
};
Map<String, Object> map = dataSnapshot.getValue(t);
assert map != null;
for (Object e : map.values()) {
list.add(e.toString());
}
for (Object e : map.keySet()) {
list1.add(e.toString());
}
Я попытался использовать orderByChild ("time") в addValueEventListener, но я не думаю, что он работает, поскольку я не могу указать правильное место в базе данных, так как я не могу получить значение пользователя
Редактировать:
try {
for (int i = list1.size()-1; i == list1.size()-1; i++) {
String guestname = String.valueOf(dataSnapshot.child(list1.get(i)).child("username").getValue());
String guestemail = String.valueOf(dataSnapshot.child(list1.get(i)).child("email").getValue());
String guestpassword = String.valueOf(dataSnapshot.child(list1.get(i)).child("password").getValue());
Log.w(TAG, "Name of newest value is " + guestname);
Log.w(TAG, "Email of newest value is " + guestemail);
Log.w(TAG, "Password of newest value is " + guestpassword);
guestname1 = guestname;
guestpassword1 = guestpassword;
guestemail1 = guestemail;
}
+1 Спасибо за это, да, не уверен, почему это было там, но думаю, что я уже использую последнюю версию .. В моем gradle: implementation 'com.google.firebase: firebase-database: 12.0.0'
Для этого вам нужно использовать orderByChild():
mDatabase = FirebaseDatabase.getInstance().getReference("users");
Query query = mDatabase.child(user.getUid()).orderByChild("time")
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (dataSnapshot childNode: dataSnapshot.getChildren()) {
System.out.printl(childNode.getKey()); //this is the unknown key you marked
System.out.printl(childNode.child("time").getValue(Long.class));
}
}
...
+1 Спасибо, выглядит правильно, я никогда не видел childNode.key ни в каких документах, и я получаю сообщение об ошибке в Android Studio при использовании этого .. Не удается разрешить символ «ключ»? Любая идея
Уупс ... извините за это. Это должен был быть getKey() на Android. В последнее время я слишком много занимаюсь JavaScript.
И последнее, не могли бы вы проверить мой отредактированный ответ, чтобы увидеть, как я раньше создавал хэш-карту, я действительно хочу поместить все узлы в хеш-карту, отсортированную по времени, а не только значения для времени. Я отредактировал вопрос, чтобы показать код ... спасибо
Наиболее важно использовать цикл, который у меня есть над dataSnapshot.getChildren(). Ваш код выполняет Map<String, Object> map = dataSnapshot.getValue(t), который теряет информацию для заказа (поскольку для него нет места на карте).
Спасибо, если я потеряю порядок в хэш-карте, что лучше использовать, если я хочу получить все значения в неизвестном узле, который отсортирован по времени?
Используемый - это упорядоченная коллекция, такая как List, а затем преобразование из (упорядоченного) снимка в снимок с помощью кода, который я показал.
Ответ ниже. Но поскольку вы звоните в
Firebase.setAndroidContext(this);, похоже, что вы используете очень старую версию Firebase SDK. Рассмотрим модернизация, чтобы получить улучшения, сделанные за последние два года.