从firebase获取子值到android应用程序

时间:2017-01-17 09:47:28

标签: android firebase firebase-realtime-database

我遇到问题,在我的Android应用程序的listview上显示我的firebase上的.child项目。

当我使用以下代码时:

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,  
}
}

2 个答案:

答案 0 :(得分:0)

您正在覆盖邮件子项下的数据。您正在寻找的是dataSnapshot.getChildren(),它将返回所有子项的列表。您的实施问题是您只是在&#34;消息&#34;下存储孩子。键。如果要存储多个值,则每次存储消息时都需要更改密钥。

如果您想自动生成密钥,可以使用此

String key = firebaseRef.child("messages").push().getKey();

这将在/ messages / path下创建一个新的唯一条目。然后,您可以使用此密钥保存数据。

答案 1 :(得分:0)

我认为问题在于您是在oncrete方法中设置适配器而不是onChildAdded和onChildChanged方法。您应该在childEventListener方法中放置 listView.setAdapter(adapter)。此外,ChildAdded和ChildChanged中的代码也是多余的。将代码放在方法中,并从事件监听器方法中调用该方法。

相关问题