无法读取或写入 firebase 实时数据库(android studio)

Posted

技术标签:

【中文标题】无法读取或写入 firebase 实时数据库(android studio)【英文标题】:Can't read or write to the firebase realtime database (android studio) 【发布时间】:2020-09-11 17:58:34 【问题描述】:

我想我连接到了火力基地,因为我收到了终端的消息

I/FirebaseInitProvider: FirebaseApp initialization successful

而且我认为我设置的规则是正确的


"rules": 
    ".read": true,
    ".write": true
  

这是我的读写代码。

public class MainActivity extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Write a message to the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("message");

    myRef.setValue("Hello, World!");



@Override
protected void onStart() 
    super.onStart();
    // Read from the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("message");
    myRef.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
            String value = dataSnapshot.getValue(String.class);
            System.out.println(value);
            Log.d("T", "Value is: " + value);
        

        @Override
        public void onCancelled(DatabaseError error) 
            // Failed to read value
            Log.w("F", "Failed to read value.", error.toException());
        
    );


还有一件很奇怪的事情,它可以打印值,但数据永远不会在控制台中更新。

打印值

I/System.out: Hello, World!
D/T: Value is: Hello, World!

但在控制台中...

【问题讨论】:

数据永远不会更新是什么意思?您在控制台中没有看到任何内容? 是的,在控制台中... 【参考方案1】:

您必须推送消息,以免它们每次都更新:

// Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("message");

//use a map
Map<String, String> message = new HashMap<>();  
message.put("text", "Hello, World!");

myRef.push().setValue(message);

在此之后,您的消息将如下所示:

message
|
|----------randomID
           |-----text : "Hello, World!"
|
|

阅读消息文本:

@Override
protected void onStart() 
    super.onStart();
    // Read from the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("message");
    myRef.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            for (DataSnapshot ds: dataSnapshot.getChildren())
              //this loops through all random ids and grabs the text 
              //you can maybe store the text in some list and do whatever.
              String value = ds.child("text").getValue(String.class);
              System.out.println(value);
              Log.d("T", "Value is: " + value);

             

        

        @Override
        public void onCancelled(DatabaseError error) 
            // Failed to read value
            Log.w("F", "Failed to read value.", error.toException());
        
    );

【讨论】:

对不起,我试过了,但没用......这次我连打印的消息都找不到了,控制台也没有任何变化。 你刷新控制台页面了吗? 一个键(消息)和一个值(无)。如上图所示 你完全按照我说的去做了吗?除了我告诉你的以外,你有没有打电话给其他的东西?您是否删除了旧代码? 是的,我只是复制粘贴了你的代码,没有调用其他的东西,把旧代码全部删除了。【参考方案2】:
    tableUser.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
         tv.setText(dataSnapshot.getValue().toString());
            Log.e(TAG, "onDataChange: " + dataSnapshot.getValue().toString());
            Toast.makeText(MainActivity.this, "" + dataSnapshot, Toast.LENGTH_SHORT).show();
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        
    );

【讨论】:

DatabaseReference tableUser = FirebaseDatabase.getInstance().getReference().child("message"); tv = findViewById(R.id.tv); //使用地图 Map message = new HashMap(); message.put("text", "Hello, World;;!"); tableUser.setValue(message); 从该代码值成功添加并且完全相同【参考方案3】:

是的,我也遇到了这个问题。我通过 IntelliJ 上的工具连接到 firebase,我可以 Logcat firebaseProjectID,这意味着它已经连接到 firebase。所以我创建了一个新项目并从旧项目中复制所有代码,通过工具连接到firebase,它可以正常使用读写数据库而无需接触任何代码。这是一个非常烦人的解决方案,但比尝试在互联网上找到解决方案更容易,我仍然无法找到它们。

【讨论】:

以上是关于无法读取或写入 firebase 实时数据库(android studio)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 4 将数据写入 Firebase 实时数据库

从 Firebase 中的实时数据库获取数据后,无法写入 Unity 的 TMPro 文本字段

尝试将帖子写入 Firebase 实时数据库时遇到无法识别的选择器发送到实例错误”

Firebase 实时电话数据库安全规则

在 Firebase 数据库中读取和写入数据

Firebase 实时数据库中有关身份验证的信息