Java 这是从Firebase检索数据的正确方法吗?
导言 我正在为学校做一个应用程序,我选择了Firebase,因为他们有大量的视频和在线资料,可以帮助你很多。但是,当你对某件事还不熟悉时,这些问题可以在这里由更有经验的人来解决 到目前为止我所了解的 我想从Firebase的实时数据库中检索一个随机数据对象。我曾看到其他帖子建议教程视频中包含的示例,但似乎没有一篇适合我: 我有一个数据库,上面有用户上传的问题,结构如下: (忘了为什么它说的是信息而不是问题,因为我在一行一行地跟随他们的教程,试图实现我的目标) 为了检索数据,您必须创建对数据库的引用,如下所示:Java 这是从Firebase检索数据的正确方法吗?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,导言 我正在为学校做一个应用程序,我选择了Firebase,因为他们有大量的视频和在线资料,可以帮助你很多。但是,当你对某件事还不熟悉时,这些问题可以在这里由更有经验的人来解决 到目前为止我所了解的 我想从Firebase的实时数据库中检索一个随机数据对象。我曾看到其他帖子建议教程视频中包含的示例,但似乎没有一篇适合我: 我有一个数据库,上面有用户上传的问题,结构如下: (忘了为什么它说的是信息而不是问题,因为我在一行一行地跟随他们的教程,试图实现我的目标) 为了检索数据,您必须创建对数据库的
//DB Object
private FirebaseDatabase mFirebaseDatabase;
//This will only reference the message part of the DB
private DatabaseReference mQuestionsDBReference;
并将其初始化为:
private void loadQuestionsDB() {
//Access point
mFirebaseDatabase = FirebaseDatabase.getInstance(); //Instanciate the object
mQuestionsDBReference = mFirebaseDatabase.getReference().child("messages"); //Only reference the
"messages" part
//System.out.println("[DEBUG] " + mQuestionsDBReference.getDatabase());
}
(我在这里初始化函数中的所有内容,该函数稍后由onCreate()
调用)
为了从数据库中随机选择一个问题,我采用了以下解决方案:
private void loadRandomQuestion() {
mQuestionsDBReference.startAt(randomNumber()).limitToFirst(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.getChildrenCount() > 0) {
System.out.println("[DEBUG-PLAY] Cargando!");
for(DataSnapshot dataSnap : dataSnapshot.getChildren()){
//Something I tried so maybe that was the problem I was facing :(
String question = dataSnap.child("-M3qlTuWw9TkD-LwQWYA").child("question").getValue().toString();
String answer1 = dataSnap.child("answer1").getValue().toString();
String answer2 = dataSnap.child("answer2").getValue().toString();
String answer3 = dataSnap.child("answer3").getValue().toString();
String answer4 = dataSnap.child("answer4").getValue().toString();
questionViewTxt.setText(question);
radioButton1.setText(answer1);
radioButton2.setText(answer2);
radioButton3.setText(answer3);
radioButton4.setText(answer4);
}
} else {
System.out.println("[DEBUG] No children :/, that's a problem right there...");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
问题和目标
我无法从数据库中成功检索随机问题,也无法检索到我需要的问题
目标是每次按下按钮或调用函数loadRandomQuestion()
,都能检索到一个随机问题
注释
我建议将所有问题加载到ArrayList中,这样会更容易 希望这能对您有所帮助,或者给您一个关于如何改进代码的想法,如果没有,那么我很抱歉我帮不上什么忙 这是一个类似的问题(已回答)
您的
mQuestionsDBReference.startAt(randomNumber())
无法工作,因为:
startAt(randomNumber())
将无法“知道”从何处开始startAt()
可以与偏移一起使用,但实际情况并非如此。FirebasestartAt()
/endAt()
查询是基于光标的,这意味着您需要指定一个从开始的值
例如,您可以执行以下操作:
mQuestionsDBReference.orderByKey().startAt("-M3qm...Q2Tz-")...
或者从一个特定的问题开始:
mQuestionsDBReference.orderByChild("Question").startAt("¿question?")...
要允许随机访问,请执行以下操作:
- ,这适用于Firestore,但同样的原则适用于实时数据库
- 还有更多
mQuestionsDBReference.orderByChild("Question").startAt("¿question?")...