我试图通过Java从Firebase读取数据。 addListenerForSingleValueEvent
以及我放在其中的任何内容都不会执行。在搜索了其他相关的堆栈问题后,我一直无法找到非Android相关的答案。请看一下,让我知道为什么这个方法没有执行。提前谢谢。
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.io.*;
public class App {
public static void main( String[] args ) {
class ServiceFile {
private FileInputStream mMyFile;
public ServiceFile(String myFile) {
try {
mMyFile = new FileInputStream(myFile);
System.out.println("The Service File exists. "); // this line prints
} catch (FileNotFoundException ex) {
System.out.println("The Service File does not exist.");
}
}
public FileInputStream getMyFile() {
return mMyFile;
}
}
ServiceFile serviceFile = new ServiceFile("/Users/xxxx/Documents/development/javaFire/serviceAccountKey.json");
FirebaseOptions options = new FirebaseOptions.Builder()
.setServiceAccount(serviceFile.getMyFile())
.setDatabaseUrl("https://xxxx.firebaseio.com")
.build();
// Initialize the app
FirebaseApp myApp = FirebaseApp.initializeApp(options);
// Get the reference to some location within the DB
final FirebaseDatabase database = FirebaseDatabase.getInstance(myApp);
DatabaseReference ref = database.getReference("/users/john");
// Attach a listener to read the data at the DB reference
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot theData) {
System.out.println("Success! "); // this line does not print
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("Cancelled" + databaseError.getMessage()); // this line does not print
}
});
}
}
我的数据库规则如下:
{
"rules": {
".read": true,
".write": "auth != null"
}
}
我在Firebase中的数据,位于/users.json
{
"john": {
"dob": "02/20/1980"
}
}
答案 0 :(得分:0)
看起来您的回调没有执行,因为您的程序在回调可以接收新数据之前结束。请记住addListenerForSingleValueEvent
是异步的(它会立即返回),因此您的main函数将立即返回,这意味着JVM将退出。
至少,您可以在函数末尾调用Thread.sleep()以确保它不会立即终止。但对于一个真实的节目,你可能会做其他事情。