addChildEventListener 不适用于 java 应用

addChildEventListener not working for java app

我正在尝试在 Java 应用中实施 Firebase admin SDK。我想将 childeventlistener 添加到 child,当添加 child 时,我想获取 child 的值并存储到系统剪贴板中。到目前为止,这是我的 main.java 文件:

import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.auth.FirebaseCredentials;
import com.google.firebase.database.*;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.io.FileInputStream;
import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException, InterruptedException {
    FileInputStream serviceAccount =
            new FileInputStream("path/to/.jason");

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
            .setDatabaseUrl("xxxxxxxxxx")
            .build();
    Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
    StringSelection data;

    FirebaseApp.initializeApp(options);
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference ref = firebaseDatabase
                .getReference().child("ClipSync");

        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                cliptext string = dataSnapshot.getValue(cliptext.class);
                Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
                StringSelection data;
                data = new StringSelection(string.getText());
                c.setContents(data, data);
                System.out.println("Child added");


            }

            @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) {

            }
        });
    while (true){}
}
}

我的cliptextclass:

public class cliptext {
String text;

public cliptext(String text) {
    this.text = text;

}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

}

我面临的问题:

  1. 当 child 添加到数据库时代码应该触发 addChildventlistner 但那没有发生。

  2. 我可以将数据写入数据库,也可以检索它,所以 firebase-admin 设置没有问题。

注意:没有收到任何编译时或运行时错误,我在 linux 中使用 intellij idea。

您需要向 cliptext class 添加一个 无参数 的构造函数。 Firebase documentation 说明了这一点:

  • The class must have a default constructor that takes no arguments

  • The class must define public getters for the properties to be assigned. Properties without a public getter will be set to their default value when an instance is deserialized

可能无法解决 所有 你的问题,但你最终也需要这样做 ;)

我不确定,但预计 Admin SDK 类似于客户端 SDK,其中侦听器回调 运行 在 "main" 线程上。

在方法 main() 的末尾,您有一个忙等待循环 while (true){}。您这样做可能是为了防止 main() 完成,这会导致您的应用程序终止。这样做完全占据了主线程,永远不会给听众机会运行。您将需要找到另一种暂停 main() 的方法,让回调有机会 运行.