Java 如何从Firebase查询

Java 如何从Firebase查询,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我已经做了很多搜索,但我不知道如何从firebase进行简单的查询。以下是my db的结构: “位置”的父项是数据库的名称。我只是想得到一份“地点”所有孩子的名单,这里是对我不起作用的地方: mFirebase = FirebaseDatabase.getInstance().getReference(); //Create location list mFirebase.child("locations").addValueEventListener(new ValueEv

我已经做了很多搜索,但我不知道如何从firebase进行简单的查询。以下是my db的结构:

“位置”的父项是数据库的名称。我只是想得到一份“地点”所有孩子的名单,这里是对我不起作用的地方:

 mFirebase = FirebaseDatabase.getInstance().getReference();
    //Create location list
    mFirebase.child("locations").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot entry: dataSnapshot.getChildren()) {
                Log.d("HERE: ", entry.toString());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
Log.d方法从未运行过,因此它从未进入forEach循环。有没有更简单的方法从数据库中查询,还是我做错了?谢谢

编辑:更改为addListenerForSingleValueEvent(),并在ForEach循环之前添加了一行,以确保实际调用了onDataChange()方法(实际上是这样的)

以下是完整的代码:(注意:我正在从SQLite切换到firebase,因此仍然有来自SQLite的代码,当我让firebase工作时,这些代码将消失

package osu.mobile_apps.ohiostatetourchallenge;

import android.content.Intent;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.*;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import database.OsuTourDbSchema.DatabaseHelper;

public class ListActivity extends AppCompatActivity {

private RecyclerView mlocations;
private RecyclerView.Adapter mAdapter;
private List<ListItem> listItems;
private DatabaseHelper mDatabaseHelper = new DatabaseHelper(this);
private DatabaseReference mFirebase;

// Stops the back button
@Override
public void onBackPressed() {}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("TESTING","ON CREATE() FOR LIST");
    setContentView(R.layout.activity_list);

    //Get username from log in activity
    //String userName = getIntent().getExtras().getString("User");

    TextView welcome = (TextView) findViewById(R.id.welcome);
    if(welcome != null) {
        //welcome.setText("Welcome " + userName + "!");
    }
    mlocations = (RecyclerView) findViewById(R.id.locationList);
    //Every item has fixed size
    mlocations.setHasFixedSize(true);
    mFirebase = FirebaseDatabase.getInstance().getReference();
    //Create location list
    mFirebase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d("Before Loop: ", dataSnapshot.toString());
            for(DataSnapshot entry: dataSnapshot.getChildren()) {
                Log.d("HERE: ", entry.getValue().toString());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    mlocations.setLayoutManager(new LinearLayoutManager(this));
    List<Location> locations = mDatabaseHelper.getLocations();
    Collections.sort(locations, Location.LocationNameComparator);
    listItems = new ArrayList<>();

    String description;
    String smallDescription;

    for(Location entry: locations) {
        description = entry.getDescription();
        //TODO Check if location is unlocked or not
        if (description.length()>110){
            smallDescription = description.substring(0,110) + "...";
        } else {
            smallDescription = description;
        }
        ListItem item = new ListItem(entry.getName(), smallDescription);
        listItems.add(item);
    }

    mAdapter = new myAdpater(listItems);

    mlocations.setAdapter(mAdapter);

}
@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.menu_list,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch(item.getItemId()){
        case R.id.map:
            //Start map activity

            return true;

        case R.id.about:
            //Start about activity
            Intent intent = new Intent(ListActivity.this, AboutActivity.class);
            startActivity(intent);
            return true;

    }
    return super.onOptionsItemSelected(item);
}

public void onClick(View v){
    Intent intent = new Intent(ListActivity.this, InformationActivity.class);
    if(v.getId()==R.id.textViewHead){
        TextView TestView = (TextView) v.findViewById(R.id.textViewHead);
        intent.putExtra("Header", TestView.getText());
    }
    startActivity(intent);
}

}
包osu.mobile_apps.ohiostatetourchallenge;
导入android.content.Intent;
导入android.provider.contacts合同;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.support.v7.widget.*;
导入android.util.Log;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.TextView;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入com.google.firebase.database.ValueEventListener;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入database.OsuTourDbSchema.DatabaseHelper;
公共类ListActivity扩展了AppCompatActivity{
私人回收站;
专用回收器查看适配器mAdapter;
私人物品清单;
private DatabaseHelper mDatabaseHelper=新的DatabaseHelper(此);
私有数据库参考mFirebase;
//停止后退按钮
@凌驾
public void onBackPressed(){}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(“TESTING”,“ON CREATE()FOR LIST”);
setContentView(R.layout.activity_列表);
//从登录活动获取用户名
//字符串用户名=getIntent().getExtras().getString(“用户”);
TextView欢迎=(TextView)findViewById(R.id.welcome);
if(欢迎!=null){
//welcome.setText(“欢迎”+用户名+“!”);
}
MLLocations=(RecyclerView)findViewById(R.id.locationList);
//每件物品都有固定的尺寸
mlLocations.setHasFixedSize(真);
mFirebase=FirebaseDatabase.getInstance().getReference();
//创建位置列表
mFirebase.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Log.d(“在循环之前:”,dataSnapshot.toString());
for(DataSnapshot条目:DataSnapshot.getChildren()){
Log.d(“此处:”,entry.getValue().toString());
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
mlocations.setLayoutManager(新的LinearLayoutManager(本));
List locations=mDatabaseHelper.getLocations();
Collections.sort(locations,Location.LocationNameComparator);
listItems=new ArrayList();
字符串描述;
字符串描述;
对于(位置输入:位置){
description=entry.getDescription();
//TODO检查位置是否已解锁
如果(description.length()>110){
smallDescription=description.substring(0110)+“…”;
}否则{
smallDescription=描述;
}
ListItem=新的ListItem(entry.getName(),smallDescription);
列表项。添加(项);
}
mAdapter=新的myAdpater(列表项);
mlocations.setAdapter(mAdapter);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单。菜单列表,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.map:
//启动地图活动
返回true;
案例R.id.关于:
//开始活动
意向意向=新意向(ListActivity.this,AboutActivity.class);
星触觉(意向);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
公共void onClick(视图v){
意向意向=新意向(ListActivity.this、InformationActivity.class);
if(v.getId()==R.id.textViewHead){
TextView TestView=(TextView)v.findViewById(R.id.textViewHead);
intent.putExtra(“Header”,TestView.getText());
}
星触觉(意向);
}
}

代码中的所有内容都是正确的,但它不起作用,因为您需要在firebase控制台中更改规则

因此,转到firebase数据库,然后单击规则并将规则更改为:

{
"rules": {
   ".read": "true",
   ".write": "true"
 }
}
您将在日志中获得以下输出:-

D/HERE:: DataSnapshot { key = 1, value = {description=sadasd, latitude=dssdfds} }

D/HERE:: DataSnapshot { key = 2, value = {description=asdasdas, latitude=randomwords} }
为未来的观众编辑

在Frank van Puffelen发表评论后,问题来自关键节点中的引用


代码中的所有内容都是正确的,但它不起作用,因为您需要在firebase控制台中更改规则

因此,转到firebase数据库,然后单击规则并将规则更改为:

{
"rules": {
   ".read": "true",
   ".write": "true"
 }
}
您将在日志中获得以下输出:-

D/HERE:: DataSnapshot { key = 1, value = {description=sadasd, latitude=dssdfds} }

D/HERE:: DataSnapshot { key = 2, value = {description=asdasdas, latitude=randomwords} }
为未来的观众编辑

在Frank van Puffelen发表评论后,问题来自关键节点中的引用


Hi Peter。我在Firebase控制台中以同样的方式设置了规则,但仍然没有输入循环。我测试了它,这就是问题所在,在循环旁边添加一个断点,然后调试应用程序,看看你得到了什么。它正在输入方法。不过,目前我在调试程序时遇到了一些问题,我会在调试后与你联系工作正常。谢谢!嘿,Peter。所以,我检查了调试器,直到创建活动布局之后才输入该方法