【问题标题】:how to get data from firebase database如何从firebase数据库中获取数据
【发布时间】:2016-12-16 03:13:06
【问题描述】:

我是 Firebase 的新手..

我正在尝试分配有关在我的应用中注册的用户的更多信息,因为名称、密码、电子邮件、图像对于每个用户来说都不够。所以我决定使用 UID 作为每个用户的密钥并将其存储在数据库中,然后我可以稍后获取。 因此,如果用户在任何其他时间登录,我想检索此数据这些数据将不会再次更改,因此 setvalue() 并添加侦听器以更改不会与我一起工作,因此我编写了代码

Query q = FirebaseDatabase.getInstance().getReference().child("users").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());

接下来我该怎么办?!

该指南没有说明有关 equalto()、如何使用查询或如何在没有侦听器的情况下检索数据的任何信息

谢谢

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    我发现每一个 firebase 事件监听器都需要一些时间来执行他们的任务,所以我只使用了标志和一些线程概念来实现与 firebase 数据检索的最佳兼容性

    static long[] COUNTER_VAR;
    static String STRING_VAR[];
    final static int TOTAL_FLAGS = 10;
    
    
    
    DATA_RECEIVED = new boolean[TOTAL_FLAGS];
    COUNTER_VAR = new long[TOTAL_FLAGS];
    STRING_VAR = new String[TOTAL_FLAGS];
    INDEX_DATA_R = 0;
    
    void increment`enter code here`_DataReceiveIndex(){
        if(INDEX_DATA_R<TOTAL_FLAGS-1) {
            INDEX_DATA_R += 1;
        }else{
            INDEX_DATA_R = 0;
        }
    }
    
    public int getCount(final String path) {
        final int cur = INDEX_DATA_R;
        DATA_RECEIVED[cur] = false;
        INDEX_DATA_R++;
        mDatabaseReference.child(path).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                COUNTER_VAR[cur] = dataSnapshot.getChildrenCount();
                    DATA_RECEIVED[cur] = true;
                }
    
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
    
            }
        });
    
        return cur;
    }
    
    
    public boolean setIds() {
    
        new Thread(new Runnable() {
            @Override
            public void run() {
                int a = getCount(APPOINT_PATH);
    
                while(!DATA_RECEIVED[a]) {
                }
    
                total_appointment = COUNTER_VAR[a];
                mDatabaseReference.child("/ID/A").setValue(total_appointment);
           }
       }).start();
    
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("users")
      Query q= usersRef.orderByKey().equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
      

      然后将侦听器附加到您的查询以获取数据。

      q.addValueEventListener(new ValueEventListener()){  }
      

      否则,您可以按以下方式构建数据:

      users:
      |-uid1 :
      |-uid2 :
      |-uid3 :
      

      这样,您只需使用此代码来检索用户的 DatabaseReference:

      String uid= FirebaseAuth.getInstance().getCurrentUser().getUid();
      DatabaseReference userRef = FirebaseDatabase.getInstance().getReference().child("users").child(uid);
      

      【讨论】:

        【解决方案3】:

        Firebase 检索查询是异步的,没有“官方”同步方式(没有回调/侦听器)。

        为什么是异步的?

        因为 Firebase 是基于云的,所以它需要通过网络调用来执行任何 CRUD 操作。

        现在您有了Query 对象,您可以简单地附加一个ValueEventListener 并在DataSnapShot 中接收您的数据。

        注意:addListenerForSingleValueEvent(listener) 只查询一次,与 addValueEventListener(listener) 相反。

        看起来像这样:

        q.addValueEventListener(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        // for example: if you're expecting your user's data as an object of the "User" class.
                        User user = dataSnapshot.getValue(User.class);
                    }
        
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        // read query is cancelled.
                    }
                });
        

        更多信息请参考Link

        编辑:事件侦听器最初触发一次,然后在您查询的数据发生变化时触发。

        【讨论】:

        • 但是这些valueEventlistener只有在数据改变的时候才会触发对吧?
        • 好问题,忘了说它们最初被触发一次,然后每当您查询的数据发生变化时就会触发它们,已编辑。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 2017-07-23
        • 2021-10-25
        • 1970-01-01
        相关资源
        最近更新 更多