#android #firebase #firebase-realtime-database
#Android #firebase #firebase-база данных в реальном времени
Вопрос:
Я перешел на Firebase для своей разработки на Android, поскольку хочу использовать многие функции Firebase (уведомления, обмен сообщениями, хранилище и т.д.), Однако у меня возникают трудности с получением данных из Firebase и я не могу найти подробную информацию в Интернете. Да, я пробовал документацию, но она не объясняет события, с которыми я сталкиваюсь.
Я хочу извлечь все данные, которые у меня есть, и вставить их в arraylist объектов. Вот статический пример:
users[i] = new User("James" (i*2.5), "Hmack00" (i*2), "https://firebasPic_2019.03.03.05.26.35.jpg.jpg?alt=mediaamp;token=cf", "United Kingdom");
База данных:
{
"Users" : {
"4PdlTlv3qjZ3BmDvrJyUut9Fnq43" : {
"Country" : "xx",
"Fullname" : "hh",
"ProfilePicture" : "htm/o/Images/SearchAdapter/4PdlTlv3qjZ3BmDvrJyUut9Fnq43/ProfilePicture/ProfilePic_2019.03.06.10.47.54.jpg.jpg?alt=mediaamp;token=b647708e-c6d5-4b45-bef0-3dc40301b73a",
"Username" : "hmack001"
},
"COg4r4io9hezhFpmK3adPucUXA93" : {
"Country" : "spain",
"Fullname" : "nat",
"ProfilePicture" : "hcom/o/Images/SearchAdapter/COg4r4io9hezhFpmK3adPucUXA93/ProfilePicture/ProfilePic_2019.03.06.19.14.17.jpg.jpg?alt=mediaamp;token=8620b321-5cef-42f0-a828-dbb7c37c8e7d",
"Username" : "nat"
},
"Tw1xRxViygNsLqrQiaaMAvAduIu1" : {
"Country" : "uk",
"Fullname" : "harveyn",
"ProfilePicture" : "t.com/o/Images/Users/Tw1xRxViygNsLqrQiaaMAvAduIu1/ProfilePicture/ProfilePic_2019.03.03.05.26.35.jpg.jpg?alt=mediaamp;token=c290e75a-5f92-4271-bcb5-c644fe1b14ef",
"Username" : "RGB"
},
"vOxr1RoDqgWogKK1lp9pfpTHc6w2" : {
"Country" : "scotland ",
"Fullname" : "greg greg",
"ProfilePicture" : "ot.com/o/Images/SearchAdapter/vOxr1RoDqgWogKK1lp9pfpTHc6w2/ProfilePicture/ProfilePic_2019.03.04.12.30.22.jpg.jpg?alt=mediaamp;token=27b024cf-0691-4121-8a27-26acf101ebc2",
"Username" : "greg"
},
"xecUOPeyMcQaQrgkU9ouDgK90Ai1" : {
"Country" : "ggh",
"Fullname" : "Da apply ",
"ProfilePicture" : "2FProfilePic_2019.03.03.04.58.50.jpg.jpg?alt=mediaamp;token=f35854c2-3ff9-4d18-9f7a-10c13f066c68",
"Username" : "gg"
}
}
}
Вот мой код, и я объясню свои ошибки после (я оставил в коде ‘zombie’, чтобы показать попытки, которые я предпринял)
//Firebase Variables
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
//Firebase Data
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
userId = mAuth.getCurrentUser().getUid();
myRef = mFirebaseDatabase.getReference().child("Users").child(userId);
//Firebase Data
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) { //Function called every time a change is made to the database
showData(dataSnapshot);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { //Function called when there is an error in the database/ with the call
Log.d("Print","Cancelled Firebase: " databaseError.toString());
}
});
}
private void showData(DataSnapshot dataSnapshot) {
int userCount = 5;
int i = 0;
for (DataSnapshot ds : dataSnapshot.getChildren()) {
//User user = new User();
//User user = new User(); //Get Count of Firebase Users
//user = new User();
if (ds.child(userId).exists()) {
/*user.setFullname(ds.child(userId).getValue(User.class).getFullname()); //set the full name
user.setUsername(ds.child(userId).getValue(User.class).getUsername()); //set the username
user.setProfilePicture(ds.child(userId).getValue(User.class).getProfilePicture()); //set the profile picture
//Display Information
Log.d("DataSnapchat Test", "ShowData Name: " user.getFullname());
Log.d("DataSnapchat Test", "ShowData Username: " user.getUsername());
Log.d("DataSnapchat Test", "ShowData Picture: " user.getProfilePicture());
ArrayList<String> userArrayList = new ArrayList<>();
userArrayList.add(user.getFullname());
userArrayList.add(user.getUsername());
userArrayList.add(user.getProfilePicture());
*/
String fullname = (String) ds.child(userId).child("Fullname").getValue();
Toast.makeText(this, "Fullname: " fullname, Toast.LENGTH_SHORT).show();
//UserListAdapter adapter = new UserListAdapter(this, R.layout.find_profiles_search, userArrayList, mProfileSearch);
//mListView.setAdapter(adapter);
i ;
}
}
}
Когда я отлаживаю код, функция showData никогда не вызывается, и ни одна из функций в прослушивателе событий значений не вызывается, это проблема асинхронности?
В настоящее время я пытаюсь извлечь данные и вставить их в переменную (буквально любые данные, как только у меня будет рабочий запрос, я могу преобразовать его в соответствие, манипулируя дочерними полями и т.д.).
Вопрос: Работает ли addValueListener только при изменении данных в базе данных? Если да, то какова альтернатива, если нет, то почему функции не работают.
Я не получаю никаких ошибок, и в консоль ничего не записывается.
Я хочу поместить свою базу данных в список массивов, я знаю, что мне не следует использовать getChildren для этого, поэтому я пытаюсь проверить, смогу ли я получить какие-либо данные, прежде чем пытаться получить все данные.
Комментарии:
1. Вы хотите сказать, что ни ваш
onDataChange
, ни вашonCancelled
не вызывается? Как в: если вы просто поместитеLog.d
инструкцию в `onDataChange , то ни одна из ваших инструкций ведения журнала не будет записана? Обычно это происходит только в том случае, если устройство не подключено к серверам Firebase.2. Да, это то, что происходит. Однако я получаю правильный идентификатор пользователя из ‘getCurrentUser()’, и когда я отлаживаю код, переменная MAuth содержит правильное значение базы данных реального времени. Я не уверен, что это Aysnc probelm, и если это так, я не знаю, как этому противостоять.
3. Переменная myRef содержит — https://{название проекта}.firebaseio.com/Users /{Идентификатор пользователя}. Однако прослушиватель событий никогда не вызывается.
4. Извините, у меня все еще возникают трудности с разбором вашего кода, поэтому я пытаюсь упростить его. Идея в том, что вы запускаете упрощенный код и сообщаете нам результат. Если вы замените вызов на
showData
простым оператором log, отображается ли оператор log в выходных данных вашего журнала?
Ответ №1:
У вас есть несколько действительно странных циклов в showData()
. Поскольку вы подключаете ValueEventListener
к узлу конкретного пользователя, вы можете просто посмотреть значения свойств для этого конкретного пользователя:
myRef = mFirebaseDatabase.getReference().child("Users").child(userId);
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("OnDataChange", dataSnapshot.getKey());
Log.d("OnDataChange", dataSnapshot.child("Fullname").getValue(String.class));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("Print","Cancelled Firebase: " databaseError.toString());
}
});