Android Studio - 从firebase检索数据无效

时间:2017-03-25 10:51:21

标签: android firebase-realtime-database

我正在努力从Firebase中检索一些数据,并且我遵循了一些正常工作的Youtube教程,

但无处不在,检索工作不再有效,

我设置的路径是正确的,但即使有我检索的数据,我也会得到一个空列表。

private ListView mListView;
private ArrayList<String> mHospitalNames= new ArrayList<>();
private Firebase mRefRoot;

这是路径:

mRefRoot=new Firebase("https://prototype-d2a84.firebaseio.com/Search/"+countryName+"/"+mCity+"/"+bloodType);

这是我正在使用的代码:

   mListView = (ListView) findViewById(R.id.listview);

    final ArrayAdapter<String> mArrayAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mHospitalNames);

    mListView.setAdapter(mArrayAdapter);

    mRefRoot.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            String value = dataSnapshot.getValue(String.class);
            mHospitalNames.add(value);
            mArrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

这就是我的数据库的样子

enter image description here

有人能说我错了吗?

2 个答案:

答案 0 :(得分:1)

如果您不使用身份验证,请检查数据库中的规则是否设置为true

{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
}

如果这不是问题,那么检查你的数据快照正在返回什么。如果您的数据库是这样的

root
  -country
     -city
       -bloodgroup
          -B+
            -123:something
            -111:something

然后你必须给出你想要获得价值的钥匙。示例

datasnapshot.child(“B +”)。child(“123”)。getValue(); //第一个孩子,即123 datasnapshot.child(“B +”)。child(“111”)。getValue(); //第二个孩子,即111

否则,如果您想要整个值集,则可以使用不同的键多次使用上面的行,或者使用类来一次获取所有值。

根据您的数据库,您将密钥作为数字,我建议更改并保留字符串,因为如果您使用类,这将导致检索数据时出现问题。

class mClass{
 private String first;
 private String second;
 mClass(){}
 mClass(String first,String second){
    this.first=first;
    this.second=second;
 }
 public String getFirst(){
  return this.first;
 }
 public String getSecond(){
  return this.second;
 }
}

现在您可以在此课程中获取数据。

mClass mclass = datasnapshot.getValue(mClass.class);

现在,您想要使用此数据,只需调用getter函数。

text.setText(mclass.getFirst());

答案 1 :(得分:0)

修改您的代码

  1. 初始化变量

    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mMessagesDatabaseReference;
    private ChildEventListener mChildEventListener;
    //for list view
    private ListView mListView;
    private MessageAdapter mAdapter;
    
  2. 在onCreate

    mFirebaseDatabase=FirebaseDatabase.getInstance();
    mMessagesDatabaseReference=mFirebaseDatabase.getReference().child("search").child("country").child("city").child("blood group"); 
    List<String> data = new ArrayList<>();
    mAdapter = new Adapter(this, R.layout.data,data);
    mListView.setAdapter(mAdapter);
    
    dataRead();
    
  3. dataRead方法

    private void dataRead() {
        if ( mChildEventListener == null) {
        mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String value = dataSnapshot.getValue(String.class);
            mAdapter.add(value);
            }
    
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
            public void onChildRemoved(DataSnapshot dataSnapshot) {}
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
            public void onCancelled(DatabaseError databaseError) {}
        };
        mMessagesDatabaseReference.addChildEventListener( mChildEventListener);
    }
       }
    
  4. String.class应如下所示。注意公共变量和空构造函数。

    public class User {
    public String user;
    public String emailId;
    public long timeStampStart;
    public long timeStampStop;
    public long diff;
    
    public User()
    {
    
    }
    public User(String user,String emailId,long timeStampStart,long timeStampStop,long diff)
    {
    this.user=user;
    this.emailId=emailId;
    this.timeStampStart=timeStampStart;
    this.timeStampStop=timeStampStop;
    this.diff=diff;
    }
    
    
    public String GetUser()
    {
    return user;
    }
    
    public String GetEmailId()
    {
    return emailId;
    }
    
    public long GetTimeStampStart()
    {  
    return timeStampStart;
    }
    public long GetTimeStampStop()
    {
    return timeStampStop;
    }
    
    public long GetDiff()
    {
    return diff;
    }
    
    public void setUser(String user)
    {
    this.user=user;
    }
    public void setEmailId(String emailId)
    {
    this.emailId=emailId;
    }
    public void setTimeStampStart(long timeStampStart)
    {
    this.timeStampStart=timeStampStart;
    }
    public void setTimeStampStop(long timeStampStop)
    {
    this.timeStampStop=timeStampStop;
    }
    
    public void setDiff(long diff)
    {
    this.diff=diff;
    }
    }
    
  5. 现在数据库看起来应该是这样的。根据您的需要进行修改

     search
        country
      -city
        -blood group
          -123
            abc:something
            bcd:something
    

    如果出现任何问题,请告诉我