【发布时间】:2017-04-13 02:30:38
【问题描述】:
问题
我想在 firebase 中获得 5 个随机节点,其中“STATE”值等于“ACEPTED”,我实施的两种解决方案都需要很多时间
解决方案 1:
此解决方案包括获取随机值,如果它们“STATE”等于“ACEPTED”,则将其添加到我的列表中。
private DatabaseReference mdatabas;
private List<String> keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_makequestions);
keys=new ArrayList<>();
mdatabas=FirebaseDatabase.getInstance().getReference()
.child("QUESTIONS").child("SPANISH");
getNofQuestions();
}
private void getNofQuestions(){
mdatabas.child("QUESTIONID").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//QUESTION ID IS EQUAL TO THE NUMBER OF QUESTIONS
nOfQuestions=dataSnapshot.getValue(Integer.class);
getRandom();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void getRandom(){
getQuestion(random.nextInt(nOfQuestions-11)+11);
}
private void getQuestion(int random){
mdatabas.child(String.valueOf(random)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(keys.size()==4){
Toast.makeText(getApplicationContext(),"FINISHED",Toast.LENGTH_SHORT).show();
}
else{
if(dataSnapshot.child("STATE").getValue(String.class)!=null){
if(dataSnapshot.child("STATE").getValue(String.class).equals("ACEPTED")){
keys.add(dataSnapshot.getKey());
getRandom();
}
else{
getRandom();
}
}
else{
getRandom();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
解决方案 2 基本上我得到了所有他们的状态值等于接受的问题,将它们洗牌,然后制作一个子列表。
private void getQuestions(){
mdatabas.orderByChild("STATE").equalTo("ACEPTED").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot:dataSnapshot.getChildren()){
keys.add(snapshot.child("ID").getValue(String.class));
}
Collections.shuffle(keys);
List<String> finalKeys = keys.subList(0, 4);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
Json 结构(在 QUESTIONS/SPANISH 下面)
{
"0" : {
"ID" : "0",
"MISPELLED" : 1,
"SPAM" : 1,
"STATE" : "ACEPTED",
"WRONGLANGUAGE" : 1,
"WRONGREGION" : 1
},
"1" : {
"ID" : "1",
"OPTION1" : "Elementos químicos ",
"OPTION2" : "Huesos ",
"OPTION3" : "Órganos ",
"OPTION4" : "Células ",
"QUESTION" : "La estequiologia se encarga de estudiar "
},
"2" : {
"CORRECT" : 1,
"ID" : "11",
"LIKES" : 15,
"OPTION1" : "Elementos químicos ",
"OPTION2" : "Huesos ",
"OPTION3" : "Órganos ",
"OPTION4" : "Células ",
"QUESTION" : "La estequiologia se encarga de estudiar ",
"STATE" : "ACEPTED",
"WRONG" : 1
},
"3" : {
"CORRECT" : 2,
"ID" : "12",
"LIKES" : 6,
"MISPELLED" : 2,
"OPTION1" : "Ingestión de cecaria enquistada en \r\nplanta de agua dulce.\r\n ",
"OPTION2" : "Ingestión de metacecaria enquistada en \r\nplanta de agua dulce.\r\n",
"OPTION3" : "Ingestión de metacecaria enquistada en \r\nplanta de agua salada",
"OPTION4" : "Ingestión de esporocito enquistada en \r\nplanta de agua dulce.\r\n",
"QUESTION" : "Mecanismos de transmisión de faciolopsis buski ",
"WRONG" : 3
},
"QUESTIONID" : 3
}
所以我的问题是,是否有其他获取数据的方法或我可以对矿山进行任何改进以降低时间复杂度?
【问题讨论】:
标签: android firebase firebase-realtime-database