android - 从 firebase 数据库中获取多个值

标签 android firebase firebase-realtime-database android-asynctask

在我们的数据库结构中,每个“User”持有多个bid-Id,每个bid-Id代表“Jobs”数据库中的一个入口点。
目前,当我们想要遍历一个人的所有工作时,代码看起来类似于:

final DatabaseReference mDatabaseJobs = FirebaseDatabase.getInstance().getReference().child("Jobs");
        DatabaseReference mDatabaseUser = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUser.getUid());
        mDatabaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                DataSnapshot userBids = dataSnapshot.child("listOfBids");
                final int num_user_bids = (int) userBids.getChildrenCount();

                for(final DataSnapshot job : userBids.getChildren()){
                    String jobId = job.getValue(String.class);
                    mDatabaseJobs.child(jobId).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            bid_count.addAndGet(1);

这里是数据库结构,目标是以某种方式获取特定人员的所有工作。

enter image description here

有没有办法一次检索所有作业?也许是 key list ?而不是为每个人调用添加监听器?
如果不是,我知道 firebase 是异步获取数据的,但它是并行获取的吗?
即我们目前增加一个原子整数来知道 firebase 是否已经获取了所有作业,因为我们不希望线程同时增加计数器,在我们当前的实现中是否有必要?
谢谢!

最佳答案

您可以在“用户”之外保留一个 HashMap,用当前用户的作业列表填充它。然后将另一个监听器附加到“作业”并遍历您的 hashMap 并获取您想要的特定作业。下面是引用代码:

HashMap<Integer, String> listOfJobs = new HashMap<>();
DatabaseReference mDatabaseUser = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUser.getUid()).child("listOfBids");

mDatabaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if (dataSnapshot.exists) {
        listOfJobs.putAll((Map) dataSnapshot.getValue());
    }
    // Here you can add a listener to the entire "Jobs" reference like this
    DatabaseReference mDatabaseJobs = FirebaseDatabase.getInstance().getReference().child("Jobs");
    mDatabaseJobs.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot userDataSnapshot) {
            if (userDataSnapshot.exists) {
                for (String jobId : listOfJobs.values()) {
                    if (userDataSnapshot.hasChild(jobId) {
                        DataSnapshot job = userSnapshot.child(jobId);
                        // here you can use job snapshot
                        bid_count.addAndGet(1); // something like this?
                    }
                }
            }
        }

});

基本上,您是在向非嵌套或非深度的对象添加监听器,并使用循环获取子项,而不是向嵌套的子项添加监听器。

希望这对您有所帮助。

关于android - 从 firebase 数据库中获取多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983638/

相关文章:

java - 我可以使用用户提供的参数在 Android Studio 中创建自定义类,以将数据存储在 Firebase RT DB 中吗

android - BouncyCaSTLe:Android:不支持的类文件主要版本 59。无法转换 bcprov-jdk15on-1.67.jar (org.bouncycaSTLe:bcprov-jdk15on:1.67)

android - 从 firebase 实时数据库复制数据

firebase - Azure Pipeline错误: Failed to get Firebase project project-name.请确保该项目存在并且您的帐户有权访问它

angular - Firebase SDK token 验证错误 : auth/argument-error

Firebase 实时数据库中的 Java HTTP 调用用于软件中的数据更改

swift - 将 firebase 快照保存为变量以在其他地方使用

Android OpenCV 2.4.2 教程 Eclipse - 无法 dlopen 相机包装库

java - 检索权限描述返回 'null'

android - 我如何在 android 上使用相机权限解决此错误?