Получить информацию из базы данных Firebase Realtime с помощью Firebase Admin SDK

Я пытаюсь получить информацию из базы данных Firebase в режиме реального времени без успеха. Я не знаю, что я делаю неправильно. Я также пробовал пример doc, и они не работали. Здесь мой код и моя db-структура firebase:

Database structure

Topics.java:

public class Topics {

 private String name;

 public Topics() {

 }

 public Topics(String name) {
    this.name = name;
 }

 public String getName() {
    return name;
 }

 public void setName(String name) {
    this.name = name;
 }

}

Main.java

public static void main(String[] args) {
    // TODO Auto-generated method stub
    FileInputStream serviceAccount;
    FirebaseOptions options = null;
    try {
        serviceAccount = new FileInputStream(".//...");
        options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("...")
                .build();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch(IOException e) {
        e.printStackTrace();
    }

    FirebaseApp.initializeApp(options);
    String topics = getDatafromFirebase();

    System.out.println("Everything right!");
}

private static String getDatafromFirebase() {
    CountDownLatch done = new CountDownLatch(1);
    StringBuilder b = new StringBuilder();
    DatabaseReference dbRef = FirebaseDatabase.getInstance()
            .getReference();

    dbRef.child("topics").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            // TODO Auto-generated method stub
            if(snapshot.exists()) {
                for(DataSnapshot s:snapshot.getChildren()) {
                    Topics t = s.getValue(Topics.class);
                    b.append(t.getName());
                    b.append(" ");
                    done.countDown();
                }
            }
            else {
                b.append("No existe ");
                done.countDown();
            }

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // TODO Auto-generated method stub
            b.append("Error: "+error.getDetails());
            done.countDown();
        }
        });
    try {
        done.await();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return b.toString();
}

Я дождался CountDownLatch за 5+ минут, что, по моему мнению, достаточно для его запуска. Кроме того, важно отметить: я успешно отправил сообщение через облачные сообщения firebase, поэтому я не думаю, что это проблема с учетными данными.

Ответ 1

Я запустил ваш код с моей базой данных с той же структурой db, и могу точно сказать, что я получаю информацию из базы данных ableto.

onDataChange точка останова не срабатывает, только если я полностью onDataChange topics. то есть. в вашем случае - пустая база данных.

Я подозреваю, что ваш URL-адрес базы данных или закрытый ключ JSON.

Следуйте инструкциям ниже для нового закрытого ключа

  1. В консоли, нажмите на значок шестеренки на левой стороне, а Tab учетных записей служб см

  2. Обратите внимание на databaseUrl и нажмите " Создать новый закрытый ключ", сохраните его. обращаться

Вот рабочий код, например

package fireb;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;


public class Fireb {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        FileInputStream serviceAccount;
        FirebaseOptions options = null;
        try {
            serviceAccount = new FileInputStream("C:\\key\\testapp-f0fe2-firebase-adminsdk-4po4a-5ce6c60b81.json");
            options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl("https://testapp-f0fe2.firebaseio.com")
                    .build();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }

        FirebaseApp.initializeApp(options);
        String topics = getDatafromFirebase();
        System.out.println(topics);
        System.out.println("Everything right!");
    }

    private static String getDatafromFirebase() {
        CountDownLatch done = new CountDownLatch(1);
        StringBuilder b = new StringBuilder();
        DatabaseReference dbRef = FirebaseDatabase.getInstance()
                .getReference();

        dbRef.child("topics").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                // TODO Auto-generated method stub
                if(snapshot.exists()) {
                    for(DataSnapshot s:snapshot.getChildren()) {
                        Topics t = s.getValue(Topics.class);
                        b.append(t.getName());
                        b.append(" ");
                    }
                    done.countDown();
                }
                else {
                    b.append("No existe ");
                    done.countDown();
                }

            }

            @Override
            public void onCancelled(DatabaseError error) {
                // TODO Auto-generated method stub
                b.append("Error: "+error.getDetails());
                done.countDown();
            }
            });
        try {
            done.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return b.toString();
    }
}

Ответ 2

Согласно имеющейся документации здесь.

Прежде чем вы сможете получить доступ к базе данных Firebase Realtime с сервера с помощью SDK Firebase Admin, вы должны пройти аутентификацию своего сервера с помощью Firebase. Когда вы аутентифицируете сервер, а не регистрируетесь с учетными данными учетной записи пользователя, как в клиентском приложении, вы выполняете аутентификацию с учетной записью службы, которая идентифицирует ваш сервер для Firebase.

Если вы не используете свой код на сервере, вы можете аутентифицироваться как клиент, как описано здесь.

Надеюсь это поможет.