当前位置: 首页 > 面试题库 >

使用Java从Firebase抓取数据

慕容宏毅
2023-03-14
问题内容

我在下面的这段代码中遇到了问题,该代码几乎逐字从Firebase SDK
Java文档复制而来。我是真正的语言(例如Java)的新手,它来自PHP和JavaScript的webdev背景。

基本上,addListenerForSingleValueEvent不会触发以向我返回数据。我注意到这是因为系统打印输出不会触发,因此我认为监听事件没有触发。

我怀疑这与我有限的知识有关,函数本身是如何工作的,就像我缺少有关类和函数如何交互的结构知识一样。

任何帮助,将不胜感激,谢谢。

class FireBase {
public static void main(String[] args) throws IOException {
    // Fetch the service account key JSON file contents
    FileInputStream serviceAccount = new FileInputStream("key.json");

    // Initialize the app with a service account, granting admin privileges
    FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
        .setDatabaseUrl("https://ssworks-adwords.firebaseio.com/")
        .build();
    FirebaseApp.initializeApp(options);

    // As an admin, the app has access to read and write all data, regardless of Security Rules
    DatabaseReference ref = FirebaseDatabase
        .getInstance()
        .getReference("petitions");
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            System.out.println("Before Get Value");
            Object document = dataSnapshot.getValue();
            System.out.println(document);
        }

        @Override
        public void onCancelled(DatabaseError arg0) {
            // TODO Auto-generated method stub
            System.out.println("This didn't work");
        }
    });
}

}

问题答案:

如果您有通过某个类的main函数在命令行上调用的java程序,则必须阻止该main函数在数据库侦听器启动之前返回。否则,程序将立即终止,并且监听器将永远不会触发。重要的是要记住,所有Firebase侦听器都是异步的,并且Firebase管理其自己的守护程序线程以与服务器进行通信。

对于使一个简单的程序等待侦听器触发的情况,可以使用这种模式来阻止主线程等待侦听器:

CountDownLatch latch = new CountDownLatch(1);
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("onDataChange: " + dataSnapshot);
        latch.countDown();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        System.out.println("onCanceled: " + databaseError);
        latch.countDown();
    }
});
latch.await();

使用CountDownLatch不是唯一的选择。您可以执行任何您要确保进程不停止的操作,包括简单地将主线程休眠的时间长于侦听器触发的时间。



 类似资料:
  • 问题内容: 我正在尝试在onCreate()事件中使用Java API从Android应用程序中的Firebase数据库读取数据。换句话说,我正在尝试做最简单的阅读,相当于… …在Javascript API中。我正在尝试使用addEventListenerForSingleValueEvent()方法,但似乎要我重写onDataChange()方法,这不是我想要的。我想在程序执行到此行时获取数据

  • 我正在使用JSoup,这是纯Java中的一个HTML解析器库,从互联网上提取和解析纯HTML页面(当然,只有很少的JS)。到目前为止,如果我想要刮取的数据附加到非常详细的HTML元素(如

  • 我需要从firestore中的以下数据结构中获取formName和id的数据。在这种情况下,如何获取数据,比如创建嵌套对象?

  • 问题内容: 我需要抓取一个网站,其内容由Angular“插入”。它需要用java完成。 我已经尝试过Selenium Webdriver(因为我之前曾使用Selenium来抓取较少动态的网页)。但是我不知道如何处理Angular部分。除了页面顶部的script标签之外,网站中只有一个地方具有Angular属性: 我在这里找到了这篇文章,但是说实话…我不知道。看来作者正在选择(这样称呼他们)’ng-

  • 我正试图从亚马逊印度网站上搜集数据。在以下情况下,我无法使用yield()方法收集响应并解析元素:1)我必须从一个产品页面移动到另一个审阅页面2)我必须从一个审阅页面移动到另一个审阅页面 产品页 评论页 代码流: 1) customerReviewData()调用getCustomerRatingsAndComments(响应) 2) GetCustomerRatings和Comments(res

  • 我正在尝试使用firebase身份验证在我的网站上实现一个重置密码页面。我得到了发送电子邮件重置密码页面工作。现在,从我的理解,你得到一个电子邮件的链接,你需要点击,在这封电子邮件将有一个代码,需要重置密码。现在我不知道如何从url中抓取所述代码,并在字段中为用户显示它。是否有可能将代码放在电子邮件正文中,并让用户输入代码?如果不是,我如何从url中抓取代码并为用户输入,以便用户只能输入密码?我的