将子值从 firebase 获取到 android 应用程序
Posted
技术标签:
【中文标题】将子值从 firebase 获取到 android 应用程序【英文标题】:Getting child values from firebase to android app 【发布时间】:2017-01-17 09:47:27 【问题描述】:我在获取我的 .child 项目时遇到问题,这些项目在我的 Firebase 上显示在我的 android 应用程序的列表视图中。
当我使用以下代码时:
String value = dataSnapshot.child("messages").getValue(String.class);
list.add(value);
adapter.notifyDataSetChanged();
我能够检索数据,但是当对 Firebase 进行更改时,所有数据都将被删除并显示新条目。
例如,我希望能够从数据库中检索 .child 条目
fDatabase.child("messages").child("message").addChildEventListener(new ChildEventListener()
我只希望它显示、更新和更改子消息。
谁能帮帮我,与数据库的连接很好,应用程序没有崩溃。只是由于不活动而断开连接。
这可能是 firebase 上的权限问题吗?
我知道我的 firebase 规则目前已公开
"rules":
"messages":
".read": true,
".write":true,
有什么建议吗?
我的代码
public class MainActivity extends AppCompatActivity
DatabaseReference fDatabase;
ListView listview;
ArrayList<String> list = new ArrayList<>();
ArrayAdapter <String> adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
listview.setAdapter(adapter);
fDatabase = FirebaseDatabase.getInstance().getReference();
fDatabase.child("messages").child("message").addChildEventListener(new ChildEventListener()
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s)
String value = dataSnapshot.child("messages").getValue(String.class);
adapter.add((String)dataSnapshot.child("messages").getValue());
list.add(value);
adapter.notifyDataSetChanged();
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s)
adapter.clear();
adapter.add((String)dataSnapshot.child("messages").getValue());
String value = dataSnapshot.child("messages").getValue(String.class);
list.add(value);
adapter.notifyDataSetChanged();
@Override
public void onChildRemoved(DataSnapshot dataSnapshot)
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s)
@Override
public void onCancelled(DatabaseError databaseError)
);
我已经看过这个问题,但也无法正常工作
Get child ID from Firebase android
当我将代码更改为事件侦听器时,我返回 null : null : null
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
listview.setAdapter(adapter);
fDatabase = FirebaseDatabase.getInstance().getReference();
fDatabase.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
for (DataSnapshot messageSnapshot : dataSnapshot.getChildren())
adapter.clear();
String temp = (String) messageSnapshot.child("temp").getValue();
String humi = (String) messageSnapshot.child("humi").getValue();
String status = (String) messageSnapshot.child("status").getValue();
adapter.add(humi + " : " + temp + " : " + status);
@Override
public void onCancelled(DatabaseError databaseError)
数据库结构
jmproject-*****
humi: "77"
status: "true"
temp: "24c"
数据库规则
"rules":
".read": true,
".write":true,
【问题讨论】:
检查这个由 firebase 提供的库。 Using FirebaseUI to Populate a ListView 【参考方案1】:您正在覆盖消息子项下的数据。您正在寻找的是 dataSnapshot.getChildren(),它将返回所有孩子的列表。您的实现问题是您仅在“消息”键下存储子项。如果要存储多个值,则每次存储消息时都需要更改密钥。
如果你想自动生成密钥,你可以使用这个
String key = firebaseRef.child("messages").push().getKey();
这将在 /messages/ 路径下创建一个新的唯一条目。然后您可以使用此密钥保存您的数据。
【讨论】:
但是使用 getChildren 对我的字符串不起作用,还有其他选择吗? 我现在已经更改了我的代码,我将结果返回为 null : null : null,我已经更新了问题 您需要从 firebase 添加您的数据库结构。否则我帮不了你。 我已经从 firebase 添加了结构。【参考方案2】:我认为问题在于您在 oncrete 方法中设置适配器,而不是在 onChildAdded 和 onChildChanged 方法中。您应该将 listView.setAdapter(adapter) 放在 childEventListener 方法中尝试一下。而且您在 ChildAdded 和 ChildChanged 中的代码也是多余的。将代码放在一个方法中,然后从您的事件侦听器方法中调用该方法。
【讨论】:
以上是关于将子值从 firebase 获取到 android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Cloud Functions for Firebase 获取子值的键?