Java 如何从firebase数据库获取数据

Java 如何从firebase数据库获取数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我是firebase的新手 我正在尝试分配更多关于在我的应用程序中注册的用户的信息,因为姓名、密码、电子邮件和图像对于每个用户都是不够的。所以我决定使用UID作为每个用户的密钥,并将其存储在数据库中,以便稍后获取。 因此,如果用户在任何其他时间登录,我想检索这些数据,这些数据将不会再次更改,因此setvalue和add listener to change将不会与我一起工作,因此,为了执行此操作,我编写了代码 Query q = FirebaseDatabase.getInstance().ge

我是firebase的新手

我正在尝试分配更多关于在我的应用程序中注册的用户的信息,因为姓名、密码、电子邮件和图像对于每个用户都是不够的。所以我决定使用UID作为每个用户的密钥,并将其存储在数据库中,以便稍后获取。 因此,如果用户在任何其他时间登录,我想检索这些数据,这些数据将不会再次更改,因此setvalue和add listener to change将不会与我一起工作,因此,为了执行此操作,我编写了代码

Query q = FirebaseDatabase.getInstance().getReference().child("users").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
下一步我该怎么办

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


感谢

Firebase检索查询是异步的,没有回调/侦听器,就没有正式的同步方式

为什么它是异步的

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

现在您有了查询对象,只需附加ValueEventListener并在DataSnapShot中接收数据

注意:addListenerForSingleValueEventlistener只查询一次,与AddValueEventListener相反

它看起来是这样的:

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.
            }
        });
有关更多信息,请参阅此


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

Firebase检索查询是异步的,没有回调/监听器,就没有同步的正式方法

为什么它是异步的

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

现在您有了查询对象,只需附加ValueEventListener并在DataSnapShot中接收数据

注意:addListenerForSingleValueEventlistener只查询一次,与AddValueEventListener相反

它看起来是这样的:

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);
您只需使用:

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

}

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

}

但这些valueEventlistener仅在数据更改时触发,对吗?好问题,忘了提及它们最初触发一次,然后在您查询的数据更改、编辑时触发。您能看看这个问题吗,但这些valueEventlistener仅在数据更改时触发对吗?好问题,忘了提到它们最初被触发一次,然后在您查询的数据发生更改、编辑时被触发。您能看一下这个问题吗