这是从 Firebase 检索数据的正确方法吗?
Posted
技术标签:
【中文标题】这是从 Firebase 检索数据的正确方法吗?【英文标题】:Is this the correct way to retrieve data from Firebase? 【发布时间】:2020-04-02 16:11:30 【问题描述】:简介
我正在为学校开发一个应用程序,我选择了 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()
时检索一个随机问题。
注意事项
- Instead of System.out.println() I could use Log
- Instead of the above I could use the debugger
- I know there are multiple listeners for referencedDB
- I am at beginner level in this subject (3 days since this post)
- I'm using Andriod Studio
【问题讨论】:
【参考方案1】:您的mQuestionsDBReference.startAt(randomNumber())
不起作用,因为:
-
您没有指定订购的依据,因此
startAt(randomNumber())
不会“知道”从哪里开始。
您在 JSON 中没有作为键或属性的相关数字,因此 Firebase 没有可匹配的内容。
您似乎认为startAt()
可以与偏移量一起使用,但事实并非如此。 Firebase startAt()
/endAt()
查询是基于游标的,这意味着您需要指定一个值开始。
例如,你可以这样做:
mQuestionsDBReference.orderByKey().startAt("-M3qm...Q2Tz-")...
或从特定问题开始:
mQuestionsDBReference.orderByChild("Question").startAt("¿question?")...
允许随机访问:
-
为每个问题添加一个具有可预测值范围的属性。
计算该范围内的随机值。
然后按该属性排序,并从该值开始。
另见:
Firestore: How to get random documents in a collection,适用于 Firestore,但同样的原则适用于实时数据库 Get random child from Firebase Database Firebase - random query How to get a random object from firebase database in android? 更多来自这些search results【讨论】:
非常感谢您不仅提供答案,还感谢您提供所有文档和视频。您的团队为绝对初学者和小型初创公司创建了一个很棒的工具。 :D【参考方案2】:我建议将所有问题加载到 ArrayList 中,这样会更容易。 https://firebase.google.com/docs/database/web/read-and-write
希望这对您有所帮助,或者让您了解如何改进代码,如果没有,我很抱歉我帮不上忙!
这是一个类似的问题(已回答)
Get random item from Firebase
【讨论】:
如果有数千个问题怎么办。那会占用很多空间。 有点帮助我,即使这是一个 Java 问题而不是 JS。谢谢老哥! 很高兴能帮上忙!以上是关于这是从 Firebase 检索数据的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
Recyclerview 不会从 firebase 检索数据
从 Firebase Auto Id 中检索数据 - Firebase Swift