addListenerForSingleValueEvent不会执行

时间:2017-02-10 18:29:26

标签: java firebase

我试图通过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" 
  }
}

1 个答案:

答案 0 :(得分:0)

看起来您的回调没有执行,因为您的程序在回调可以接收新数据之前结束。请记住addListenerForSingleValueEvent是异步的(它会立即返回),因此您的main函数将立即返回,这意味着JVM将退出。

至少,您可以在函数末尾调用Thread.sleep()以确保它不会立即终止。但对于一个真实的节目,你可能会做其他事情。