【问题标题】:Firebase ValueEventListener not firing at allFirebase ValueEventListener 根本没有触发
【发布时间】:2018-07-17 17:17:41
【问题描述】:

我只是想触发这个 Firebase ValueEventListener。我在侦听器内部设置了断点,以检查它们是否正在触发,而它们不是。我不确定为什么它不起作用,因为对我来说一切都很好。是否有任何与 Firebase 相关的原因导致此应用无法运行?

package sampleproj.wisen.android.sampleproj;

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

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 MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DatabaseReference d = FirebaseDatabase.getInstance().getReference();
        d.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                int r = 0;
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }
}

更新: 这是数据库的结构:

我已经尝试在最深的子级访问数据库。重点是检索两个用户之间的消息列表。

    final String senderUsername = "WiseNN";
    final String recipeintUsername = "tellMeWhen2Go";
    final String messagesKey = "messages";
    DatabaseReference DBRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference DBMsgsRef = DBRef.child("privateChat").child(senderUsername).child(recipeintUsername).child(messagesKey).getRef();

【问题讨论】:

  • 分享你的数据库结构。
  • 我已经上传了数据库的结构
  • 发布您要检索的文档的扩展结构。
  • 发布了更新的数据库结构
  • 1.它会给您的 logcat 带来任何错误吗? 2. 将DatabaseReference DBMsgsRef = DBRef.child("privateChat").child(senderUsername).child(recipeintUsername).child(messagesKey).getRef(); 更改为DatabaseReference DBMsgsRef = DBRef.child("privateChat").child(senderUsername).child(recipeintUsername).child(messagesKey); 3. 检查您的数据库规则

标签: android firebase android-studio firebase-realtime-database


【解决方案1】:

尝试在 getReference() 方法中将"privateChat/WiseNN/tellMeWhen2Go/messages/" 作为数据库引用。

DatabaseReference d = FirebaseDatabase.getInstance().getReference("privateChat/WiseNN/tellMeWhen2Go/messages/");

【讨论】:

  • 我试过了:/privateChat, privateChat & privateChat/。这些似乎都不起作用。
  • 我可以知道“privateChat”里面的数据是什么吗?
  • 要检索两个用户之间的消息列表,我认为您需要考虑数据结构的设计,因为 Firebase 对查询功能有限制。
  • 不知道为什么这被赞成......这与问题无关。这是误导。
【解决方案2】:
String data, message;
DatabaseReference d = FirebaseDatabase.getInstance().getReference("privateChat").child("WiseNN").child("tellMeWhen2Go").child("messages");
d.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            data = ds.child("data").getValue().toString();
            message = ds.child("message").getValue().toString();
            // similarly for sender & time

        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

【讨论】:

  • 我希望这能解决您的问题。因此,请接受答案并对其进行投票,以便对其他人有用。
  • 这和我上面的代码完全一样。但是,我已经复制/粘贴了您的代码并尝试运行它。这是行不通的。我知道代码没有任何问题,是否还有其他原因监听器不会触发。也许与 android studio 版本或 firebase 配置有关?
  • 另一个原因可能是 Firebase 规则。请参阅 Firebase 规则。
  • 我想通了,这不是代码(正如我之前所说)。我认为这是由于某种 firebase 故障。我以前使用相同的代码调用 firebase 没有问题。它只是突然停止工作。但它现在工作正常。
  • 我自己写了答案,因为所提供的答案都不适合我。
【解决方案3】:

我正在写我自己的答案,因为我刚刚弄明白了。

我认为这是由于某种 Firebase 故障造成的。当我登录到我的谷歌控制台时,我发现我没有数据库(里面什么都没有),而我知道事实上存在一个。但是,这对于为什么回调函数没有触发是有道理的。

奇怪的是,我从 GitHub 克隆了一个新的示例 firebase android 应用程序,将其添加到我在 google 控制台中的 Firebase 应用程序,然后将一个新对象写入实时数据库(来自新的示例 android 应用程序)。这样做之后,我的整个 firebase 数据库结构就重新出现了。

在那之后,我回到了我最初正在开发的主应用程序,并使用与以前完全相同的代码调用了 firebase ......并且它成功了。我知道这听起来可能不合理,但这确实是刚刚发生的事情。

【讨论】:

    【解决方案4】:

    你错过了 .child("messages");

    DatabaseReference DBRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference DBMsgsRef = DBRef.child("privateChat").child(senderUsername).child(recipeintUsername).child("messages").child(messagesKey).getRef();
    

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 2022-12-14
      • 2014-04-22
      相关资源
      最近更新 更多