在Android

时间:2017-10-18 22:00:15

标签: android firebase firebase-realtime-database

好吧,我想创建这个方法,但由于你无法从监听器的方法返回,我只是想办法在firebase找到它时给用户:

public static User findByID(@NonNegative final int id) {
    getDatabase().orderByChild("id")
            .equalTo(id)
            .limitToFirst(1)
            .addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    dataSnapshot.getValue(User.class);    // this one must be returned
                }

                @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(DatabaseError databaseError) {}
            });
}

创建一个接收值和返回的变量也不起作用,因为firebase需要一点时间才能找到用户。

1 个答案:

答案 0 :(得分:3)

数据检索在Firebase中是异步的,因此您无法返回。我认为有两种方法可以克服你所面临的问题。

第一种方式

如果数据应该返回到存在findById()的同一个类中的某个位置,那么您可以执行以下操作:

class A {

    private TextView nameTextView;

    ...

    public void findById(@NonNegative int id) {
        userRef().orderByChild("id")
            .equalTo(id)
            .limitToFirst(1)
            .addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    User user = dataSnapshot.getValue(User.class);
                    onUserRetrieved(user);
                }
                ...
            });
    }

    private void onUserRetrived(User user) {
        // Now you can do whatever you want with the "user"
        // For instance, update name field in the layout...
        nameTextView.setText(user.getName);
        ...
    }
}

第二种方式

如果需要通知另一个类的实例,可以将侦听器作为参数传递给该函数,然后调用该侦听器中的方法作为通知调用者的方法。示例调用程序如下所示:

class Caller {

    ...

    private void someFunction() {
        ...
        String userId = 1; // Get user id somehow
        DatabaseUtil.findUserById(userId, new DatabaseUtil.Listener() {
            @Override
            public void onUserRetrieved(User user) {
                // Now you can do whatever you want with the "user"
            }
        });
        ...
    }
}

而静态函数可以如下所示驻留在类中:

class DatabaseUtil {

    public static void findUserById(@NonNegative int id, Listener listener) {
        FirebaseDatabase.getInstance().getreference("user")
            .orderByChild("id")
            .equalTo(id)
            .limitToFirst(1)
            .addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    User user = dataSnapshot.getValue(User.class);
                    listener.onUserRetrieved(user);
                }
                ...
            });
    }

    interface Listener {
        void onUserRetrieved(User user);
    }
}