无法从Java Admin SDK向Firebase实时数据库添加数据

时间:2018-06-26 14:58:00

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

我试图从一个简单的Java程序向Firebase实时数据库添加数据 它已按照https://firebase.google.com/docs/database/admin/save-data

中的说明正确执行

但是我看不到Firebase控制台上的数据-实际上没有将其添加到数据库中

代码

public static void main(String[] args) {

    FileInputStream serviceAccount;
    try {
        serviceAccount = new FileInputStream("E:\\development\\firebase\\key\\svbhayani_realtimedb-98654-firebase-adminsdk-n75sy-49f62c9338.json");
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("https://realtimedb-98654.firebaseio.com")
                .build();

        FirebaseApp.initializeApp(options);

        final FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference ref = database.getReference("sameer");

        DatabaseReference usersRef = ref.child("users");

        Map<String, String> users = new HashMap<>();
        users.put("HaiderAli", "HaiderAli");
        users.put("sameer", "HaiderAli");

        usersRef.setValueAsync(users);

        System.out.println("Done");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

如果有人可以解释-bcoz没有任何错误,我将从https://firebase.google.com/docs/database/admin/save-data执行相同的步骤

1 个答案:

答案 0 :(得分:4)

您的程序将在SDK完成写入之前终止。 setValueAsync是异步的,因此它在另一个线程上的写操作完成时立即返回。这意味着main函数也会立即返回。当您的主函数返回时,java进程终止,并且异步写入永远不会完成。您需要做的是使程序等待写入完成。

setValueAsync返回一个ApiFuture对象,该对象使您可以跟踪异步操作的结果。使程序等待一段时间以使ApiFuture完成的最简单的操作可能是使用其get()方法:

ApiFuture<Void> future = usersRef.setValueAsync(users);
future.get(10, TimeUnit.SECONDS);  // wait up to 10s for the write to complete

在实际的生产代码中,您可能需要做一些更复杂的事情,例如,监听ApiFuture的结果以继续执行代码或处理错误。

Read more about async operations with the Admin SDK in this blog