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){}
}
}
我的cliptext
class:
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;
}
}
我面临的问题:
当 child 添加到数据库时代码应该触发 addChildventlistner 但那没有发生。
我可以将数据写入数据库,也可以检索它,所以 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()
的方法,让回调有机会 运行.
我正在尝试在 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){}
}
}
我的cliptext
class:
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;
}
}
我面临的问题:
当 child 添加到数据库时代码应该触发 addChildventlistner 但那没有发生。
我可以将数据写入数据库,也可以检索它,所以 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()
的方法,让回调有机会 运行.