addChildEventListener不适用于java app

时间:2017-05-30 18:32:43

标签: java firebase firebase-realtime-database firebase-admin

我正在尝试在Java应用中实施Firebase管理SDK。我想向孩子添加childeventlistener,当孩子添加时我想要带孩子的价值并存储到系统剪贴板中。到目前为止,这是我的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){}
}
}

我的cliptext课程:

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. 当孩子被添加到数据库时,代码shoud触发addChildeventlistner但是没有发生。

  2. 我可以将数据写入数据库并且还可以对其进行检索,因此firebase-admin设置没有问题。

  3. 注意:没有得到任何编译时或运行时错误&我在linux中使用intellij的想法。

2 个答案:

答案 0 :(得分:0)

您需要添加一个将无参数的构造函数添加到cliptext类。 Firebase documentation明确了这一点:

  
      
  • 该类必须具有不带参数的默认构造函数

  •   
  • 该类必须为要分配的属性定义公共getter。没有公共getter的属性将在反序列化实例时设置为默认值

  •   

可能无法修复所有您的问题,但您最终也需要这样做;)

答案 1 :(得分:0)

我不确定,但我希望Admin SDK类似于客户端SDK,其中监听器回调在" main"线程。

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