Java 如何从Firebase查询
我已经做了很多搜索,但我不知道如何从firebase进行简单的查询。以下是my db的结构: “位置”的父项是数据库的名称。我只是想得到一份“地点”所有孩子的名单,这里是对我不起作用的地方: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
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。所以,我检查了调试器,直到创建活动布局之后才输入该方法