java - 使用Java在android studio中查询firebase数据库

标签 java android firebase firebase-realtime-database

我在从 Firebase 数据库获取数据时遇到问题。 仅当当前用户 ID 存在于参与子文档中时,我才需要收集数据并将其附加到数组中。

请查看数据库结构: Database structure

这是我试图用来解决的代码。

private DatabaseReference mDB = FirebaseDatabase.getInstance().getReference().child("events");
private FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
private String userid = user.getUid();

mDB.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                try{
                    for (DataSnapshot chidSnap : dataSnapshot.getChildren()) {

                        for(DataSnapshot participant : chidSnap.child("participants").getChildren()){

                            String participantKey = participant.getKey();
                            Log.d(TAG, "onDataChange: " + participantKey);

                            String participantId = (String) participant.child(participantKey).getValue();
                            Log.d(TAG, "onDataChange: " + participantId);

                            if(participantId.equals(userid)){

                                mEventKeys.add(chidSnap.getKey()); //displays the key for the node
                                mEventNames.add((String) chidSnap.child("event_name").getValue());
                                mEventShortDescriptions.add((String) chidSnap.child("event_name").getValue());
                                mEventLongDescriptions.add((String) chidSnap.child("event_name").getValue());
                                mEventCityLocations.add((String) chidSnap.child("event_name").getValue());
                                mEventDates.add((String) chidSnap.child("event_name").getValue());
                                mEventHours.add((String) chidSnap.child("event_name").getValue());
                            }
                        }
                    }
                }catch (Exception e){
                    Log.d(TAG, "onDataChange: " + e.toString());
                }



                initRecyclerView(recyclerView);
            }

我正在尝试获取单个参与者的 key (并且我成功地做到了这一点),然后插入下载的 key 以查询该 key 的值。当我尝试获取特定键的值时,我收到一个 Null 值。

你们能帮忙吗?

此外,如果您对如何改进从 Firebase 下载数据有一些建议,我很乐意看到它们!我感觉我的方法不是最佳的。

最佳答案

不需要获取 key 并在引用中使用,您只需循环两次,如以下代码行所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference eventsRef = rootRef.child("events");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
            DataSnapshot participantsSnapshot = snapshot.child("participants");
            for(DataSnapshot ds : participantsSnapshot.getChildren()) {
                String uid = ds.getValue(String.class);
                Log.d(TAG, uid);
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
eventsRef.addListenerForSingleValueEvent(valueEventListener);

logcat 中的结果将是 participants 数组中存在的所有 uid。

关于java - 使用Java在android studio中查询firebase数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59869720/

相关文章:

java - iText:根据 ResultSet 更改页面尺寸

java - 如何更改弹出窗口 TextView 中的文本?

firebase - 在 Firestore 中为文档 ID 自定义对象建模的最佳方法是什么?

javascript - Firebase DB 同时更新和推送

java - public classG<A extends X & Y & Z> 关于 Java 中的泛型

java - 如何使用 REGEX 匹配制表符和换行符而不匹配空格?

java - 当 HashMap 值为 true 时任务不会被取消

android - 多个异步任务挂起应用程序

android - 如何在 onPictureTaken 功能后恢复 android 相机预览?

android - Firebase 电话验证短信代码 null android