将子值从 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firebase 实时数据库中获取子值?

付款时的子值计数器 Firebase Android

如何使用 Cloud Functions for Firebase 获取子值的键?

如何从 firebase 实时数据库中获取子值和过滤器?

Firebase/Android:将检索到的值从 Firebase 添加到 arraylist 会返回空指针异常

如何使用两个子值在 Firebase 中进行搜索?