【问题标题】:Querying Firebase on Android在 Android 上查询 Firebase
【发布时间】:2015-11-27 11:21:53
【问题描述】:

这是我的数据:

{
  "users" : {
    "00c49c66-7ac8-9a48-7c4541d8bac6" : {
      "email" : "d@gmail.com",
      "gender" : "m",
      "name" : "deepak",
      "user_id" : "00c49c66-7ac8-9a48-7c4541d8bac6"
    },
    "1cb9c1de-1fcf-a2cc-bf78c84e03c8" : {
      "email" : "e@gmail.com",
      "gender" : "f",
      "name" : "ekta",
      "user_id" : "1cb9c1de-1fcf-a2cc-bf78c84e03c8"
    },
    "38211c3f-6c48-8987-0c698b9b9b52" : {
      "email" : "c@gmail.com",
      "gender" : "m",
      "name" : "chirag",
      "user_id" : "38211c3f-6c48-8987-0c698b9b9b52"
    },
    "a536cf1f-419f-9658-cfb5f5a8ec78" : {
      "email" : "a@gmail.com",
      "gender" : "m",
      "name" : "aniket",
      "user_id" : "a536cf1f-419f-9658-cfb5f5a8ec78"
    },
    "c80d828d-48d7-a79a-9cc558cd1960" : {
      "email" : "b@gmail.com",
      "gender" : "f",
      "name" : "bhakti",
      "user_id" : "c80d828d-48d7-a79a-9cc558cd1960"
    }
  }
}

现在我想获取 'name' 和 'id' 其中 'gender' 是 "m"

请谁能告诉我如何从 Android 客户端向 Firebase 发起这样的查询。

我尝试了 firebase 提供的教程和一些其他链接,但没有通过。

大多数解决方案都在 Javascript 中,我在 firebase 的 java api 中需要它用于 Android。

我试过了

public class ActivityHome extends Activity {
    String strLoggedInUserID;
    TextView tvData;
    Firebase fbRef = new Firebase("https://myurl.com/users");


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        tvData = (TextView) findViewById(R.id.tvData);

        Query queryRef = fbRef.orderByChild("gender").equalTo("m");

        Bundle extras = getIntent().getExtras();
        strLoggedInUserID = extras.getString("userID");

        fbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

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

                //long longChildCount = dataSnapshot.getChildrenCount();

                // tvData.setText(dataSnapshot).toString();
                tvData.setText(s);

            }

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

            //tvData.setText(s);

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

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

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

    }
}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您的查询代码看起来正确,但您没有打印用户。

    由于您要添加 ChildEventListener,因此将为每个孩子调用它:

    queryRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    
            //long longChildCount = dataSnapshot.getChildrenCount();
    
            // tvData.setText(dataSnapshot).toString();
            tvData.setText(s);
    
        }
    

    dataSnapshot 参数包含有关单个用户的信息。要打印他们的密钥、姓名和电子邮件:

    queryRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            System.out.println(dataSnapshot.key());
            System.out.println(dataSnapshot.child("name").getValue());
            System.out.println(dataSnapshot.child("email").getValue());
        }
    

    或者,您可以使用ValueEventListener 一次听所有孩子的声音。

    private static class User {
        String email;
        String gender;
        String name;
        @JsonProperty("user_id")
        String userId;
    
        public String getEmail() { return email; }
        public String getGender() { return gender; }
        public String getName() { return name; }
        public String getUserId() { return userId; }
    }
    queryRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child: dataSnapshot.getChildren()) {
                User user = child.getValue(User.class);
                System.out.println(user.getEmail());
            }
        }
    
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });
    

    在最后一个 sn-p 中,我还使用 User 类从 DataSnapshot 获取数据。随着应用程序的增长,这将比不断调用DataSnapshot.child() 更方便。

    section on reading data in the Firebase documentation 对此进行了介绍。

    【讨论】:

    • 谢谢@Frank van Puffelen 先生,因为开始开发应用程序可能需要更多帮助:)
    • 在继续使用您的应用程序之前,您最好阅读我链接到的整个编程指南。每天几个小时将为您节省大量时间和问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多