gpt4 book ai didi

java - 如何从 Firebase 查询

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:00 25 4
gpt4 key购买 nike

我做了很多搜索,但我不知道如何从 firebase 进行简单的查询。这是我的数据库的结构:

Database

“locations”的父级是数据库的名称。我试图获取“位置”的所有子项的列表,以下是对我不起作用的内容:

 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() 方法(确实如此)

mFirebase.child("locations").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("Entered: ", "onDataChange");
for(DataSnapshot entry: dataSnapshot.getChildren()) {
Log.d("HERE: ", entry.toString());
}
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

这是完整的代码:(注意:我正在从 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);
}

}

最佳答案

代码中的所有内容都是正确的,但它不起作用,因为您需要更改 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} }

为 future 的观看者进行编辑

在 Frank van Puffelen 评论后,问题出在关键节点的引文上

sample

关于java - 如何从 Firebase 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com