繁体   English   中英

如何从Firebase数据库获取数据

[英]how to get data from firebase database

我是Firebase的新手。

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

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

我下一步该怎么办?

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

谢谢

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.
            }
        });

有关更多信息,请参考此链接

编辑:事件侦听器最初被触发一次,然后每当您查询的数据发生更改时便被触发。

您可以使用:

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);

我发现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();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM