繁体   English   中英

Android 从 Firebase 获取数据

Android get data from Firebase

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想建立一个问题系统。 每个问题都有一个类别,例如,关于绘画、关于音乐的问题。

我的 Firebase 架构是这样的:

在此处输入图片说明

所以我想咨询有关音乐的问题,我试过:

mDatabase.child("questions").child("music").addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            // Get question value
            Questions questions = dataSnapshot.getValue(Questions.class);
            String question = questions.getQuestion();
            Toast.makeText(MainActivity.this, question, Toast.LENGTH_LONG).show();
        }

但我的吐司是空的。 任何想法为什么?

我也有 Questions.java:

public class Questions {

        public String question;

        public Questions() {
            // Default constructor required for calls to DataSnapshot.getValue(User.class)
        }

        public Questions(String question) {
            this.question = question;
        }

        public String getQuestion(){
            return question;
        }

}
2 个回复

如果你在你的模式中注意到, paintingmusic是不同的键。

您可以修改您的架构,例如

-- questions
   --- key
       --- paintingQuestion
       --- musicQuestion

你的模型会变成

public class Questions {

        public String paintingQuestion;
        public String musicQuestions;

        public Questions() {
        }

        //.../

}

或者更好的方法是像这样修改你的架构

-- questions
       --- key
           --- question
           --- type
           --- created


public class Questions {
    
            public static final String TYPE_MUSIC = "music"; 

            public String question;
            public long created;
            // Int or string your choice. music, question
            public String type = TYPE_MUSIC; // Int or String.. default is music, 
    
            public Questions() {
            }
    
            //.../
    
    }

修改架构后,从 firebase 获取数据。

使用以下参考时:

mDatabase.child("questions").child("music")

您告诉 Firebase 实时数据库返回存在于以下层次结构下的所有元素:

Firebase-root -> questions -> music

你永远不会得到任何元素,因为这样的路径不存在。 我这样说是因为在“问题”节点和“音乐”属性之间缺少一个孩子,即 ID。 有两种方法可以帮助您解决这个问题。

在第一个中,您保留您的实际模式,不做任何更改,并使用以下代码行来获取,例如,所有音乐问题:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference questionsRef = rootRef.child("questions");
Query query = questionsRef.orderByChild("music");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("music").getValue(String.class);
            if (music != null) {
                Log.d(TAG, name);
            }
        }
    }

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

logcat 中的结果将是:

What kind of music do you like?
Which is more important to you, music or TV?

第二种方法是创建一个像这样的 POJO 类:

class Question {
    public String type, name;
}

使用这种方法,您需要稍微更改数据库架构,如下所述:

 Firebase-root
    |
    --- questions
           |
           --- 84384238423842
           |     |
           |     --- type: "music"
           |     |
           |     --- name: "What kind of music do you like?"
           |
           --- 8rs8842348234
                 |
                 --- type: "music"
                 |
                 --- name: "Which is more important to you, music or TV?"

这样,就需要如下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference questionsRef = rootRef.child("questions");
Query query = questionsRef.orderByChild("type").equalTo("music");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Question question = ds.getValue(Question.class);
            Log.d(TAG, question.name);
        }
    }

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

logcat 中的结果将与上述相同。

3 从android中的firebase获取数据

假设我在 firebase 中的数据存储如下: 我想通过输入字符串输入,将该字符串输入与时间戳对象中的 start_time 值进行比较来获取 sensor_data 对象中的持续时间值。 如何执行这样的查询? 字符串输入是否必须与 start_time 值完全匹配? ...

4 firebase/Android:在获取数据的同时获取图像

在 firebase 实时数据库中,我保存了有关产品的信息,在 firebase 存储中,我保存了产品的相应图像。 我希望在调用产品数据时也获取图像,我知道如何调用数据并将其放置在 editText 中,但我不知道如何在 ImageView 中调用和显示图像。 这是我保存图像的方式: 这是我保 ...

6 从Firebase获取数据的Android片段未显示

我有一个带有底部导航视图的应用程序,该视图在4个片段之间切换,我正在尝试使用FirebaseRecyclerView Adapter从Firebase的数据显示这些片段。 我已完成所有设置,但没有显示FirebaseRecyclerView适配器膨胀的布局。 我的MainAcitiv ...

7 在Android中从Firebase获取常量数据

如何从Firebase获取恒定值? 我正在维护用户拥有的朋友数量的全局计数变量。 每次用户想要添加朋友时,我都需要增加该变量。 我该如何实现。 如果使用OnDataChangeListener(),则仅当数据有某些更改时,我才能读取DataSnapShot。 但是,即使部分数据 ...

10 Android - 无法从 Firebase 获取数据

我正在尝试从 firebase 获取数据,但由于某种原因,它没有获取数据。 我的数据库结构 我想在这里获取产品。 但它没有获取任何东西。 它只显示空值。 在 Logcat 中它没有显示错误。 DisplayOrderDetails 活动的代码。 注意: orderID和UserID不为 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM