【问题标题】:How to get value from Firebase and save in an attribute using java code如何从 Firebase 获取值并使用 java 代码保存在属性中
【发布时间】:2018-06-15 06:31:23
【问题描述】:

我正在尝试创建一个“读取”方法,该方法将使用 android studio (Java) 从 Firebase (Google 服务器) 获取值 我写了下面的代码,但问题是 value[0] 总是返回 "" 作为一个值,而不是来自服务器的值。 当我在方法“onDataChange”内部时,值[0]等于来自服务器的值,但在外部,它返回到原始值。 我的代码有什么问题? 请帮忙

/**
 * Return value
 *
 * @param parent
 * @param child
 * @param key
 * @return
 */
public static String read(String parent, String child, String key) {
    final String[] value = {""};
    // Get a reference to our posts
    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference(parent).child(child);

    // Attach a listener to read the data at our posts reference
    ref.child(key).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String str = dataSnapshot.getValue(String.class);
            System.out.println(str);
            value[0] = str;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
        }
    });

    return value[0];
}

}

【问题讨论】:

    标签: java firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    它是一个异步方法,试试这样的方法

        public static String read(String parent, String child, String key) {
        final String[] value = {""};
        // Get a reference to our posts
        final FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference ref = database.getReference(parent).child(child);
    
        // Attach a listener to read the data at our posts reference
        ref.child(key).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String str = dataSnapshot.getValue(String.class);
                System.out.println(str);
                value[0] = str;
                passingValue(value[0]);
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });
    
        return value[0];
    }
    
        private void passingValue(String temp){
    //do something with your string
    
    }
    

    在 OndataChange 范围之外,该值不会被保留

    【讨论】:

      【解决方案2】:

      这是由于onDataChange() 方法的异步行为而发生的,该方法甚至在您从数据库中获取数据之前就被调用。一个快速的解决方法是在 onDataChange() 方法中声明和使用您的数组,如下所示:

      ref.child(key).addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              String[] value = {""}; //declaration of the array
              String str = dataSnapshot.getValue(String.class);
              System.out.println(str);
              value[0] = str;
              passingValue(value[0]);
          }
      
          @Override
          public void onCancelled(DatabaseError databaseError) {
              System.out.println("The read failed: " + databaseError.getCode());
          }
      });
      

      请查看onDataChange() 方法中数组的声明。如需更复杂的答案,请参阅我在此 post 中的回答,其中还包含有关如何在 onDataChange() 方法之外使用该值的参考

      【讨论】:

        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 2016-11-05
        • 2023-04-11
        • 2015-06-13
        相关资源
        最近更新 更多