【发布时间】:2018-10-13 16:12:00
【问题描述】:
我试图从 Firebase 实时数据库中获取一些信息,但没有成功。我不知道我做错了什么。我还尝试了文档的示例,但它们没有用。这是我的代码和我的 firebase db 结构:
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 云消息传递成功发送消息,因此我认为这不是凭据问题。
【问题讨论】:
-
乍一看,代码对我来说很好。如果在
onDataChange中设置断点,会触发吗? -
@FrankvanPuffelen 在
onDataChange和onCancelled中都设置了断点。它们不会被触发。 -
发生这种情况的唯一原因是客户端永远无法从服务器获得答案。这可能会发生(根据我的经验),因为客户端没有互联网连接,或者因为客户端在数据从服务器返回之前退出。
-
另一个原因可能是凭据设置不正确。如果您的计算机的 SHA 密钥正确,请检查 firebase 控制台。当您说您使用 FirebaseCloudMessaging 时,您的意思是在这段代码中?
-
@Juanje 如何检查 firebase 和我的计算机中的 SHA 密钥?不是我的问题中的代码。我编写了一个方法,使用相同的 Firebase 初始化(相同的凭据、相同的数据库 URL 等)向我的应用发送通知。
标签: java firebase firebase-realtime-database