addValueEventListener 未使用 Firebase 在 Android Studio 中启动

时间:2021-06-26 17:10:53

标签: android firebase firebase-realtime-database

我在 Stack Overflow 上搜索了有关此问题的所有问题,但没有得到正确答案。答案部分或评论部分中发布的答案对我不起作用。我试图记录这些值,但 addValueEventListener 没有触发。但是,我可以在日志中的 addValueEventListener 函数之前看到正确的数据库引用 (toString)。我已允许所有用户访问数据库,因此不应该存在身份验证问题。我也尝试将其添加到 MainActivity.class 中,但这似乎不起作用。我在数据库上有 SHA1 指纹,并且也有到数据库的连接,因为我的 log.d 打印了数据库引用子值。

我的数据库规则如下:

{
  "rules": {
    ".read": "auth == null",
    ".write": "auth == null",
  }
}

ReadWriteActivity.class

package com.example.grocery;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;

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;

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.*;

public class ReadWriteActivity extends AppCompatActivity {

    private ListView listView;

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

        listView = findViewById(R.id.listView);

        final ArrayList<String> list = new ArrayList<>();
        final ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.list_item, list);
        listView.setAdapter(adapter);

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("names");
        Log.d("DATABASE REFERENCE", reference.toString());
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                list.clear();
                for (DataSnapshot datasnapshot : snapshot.getChildren()) {
                    Log.d("KEY VALUE", datasnapshot.getValue().toString());
                    list.add(datasnapshot.getValue().toString());
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.w("KEY ERROR", "Failed to read value.", error.toException());
            }
        });
    }
}

activity_read_write.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ReadWriteActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:padding="10dp" />

</RelativeLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16dp"
    android:textStyle="bold"/>

1 个答案:

答案 0 :(得分:0)

firebaser 在这里

您在哪个地区创建了实时数据库实例,何时下载了 google-services.json?如果不是美国或者如果您在创建数据库之前下载了 google-services.json,则 SDK 将无法确定正确的数据库 URL。

在这种情况下,您有两个选择来修复它:

  1. 您可以在调用 getInstance() 时指定完整的数据库 URL,如下所示:FirebaseDatabase.getInstance("your database URL").getReference()
  2. 您可以在创建数据库后下载更新的 google-services.json,并确保您的应用使用该文件。

现在很容易错过这种情况,因为相关警告被记录为调试消息。我们正在努力更明确地显示消息,但同时上述内容也应该有效。