我得到了Firebase用户Uid,但其dataSnapshot键值返回null

时间:2019-11-17 18:04:33

标签: java android firebase firebase-realtime-database

我的Firebase实时数据库结构

enter image description here

我在eBook项目中制作了两个应用程序,一个用于管理员,另一个用于用户。

当管理员在Firebase上输入书籍数据时,用户将可以在其应用程序中查看管理员提供的信息。

我在用户应用程序上执行了此操作,但是admin ID仍然具有以下键的值为空。

当我调试应用程序时,我的DataSnapshot向我显示了密钥的空值。

我的应用调试模式:

when I get admin Uid but it show me null

when I set admin id in database Reference and its get Uid

and I'm get admin Id throw database reference but it dataSnapshot key's value is null

这是我的代码:

private String adminId;
private Button button1,button2,button3;
private RecyclerView bookListRv;
private ArrayList<Book> bookList;
private BookAdapter bookAdapter;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;

public BookListFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_book_list, container, false);

    init(view);
    adminId = firebaseAuth.getUid();


    configRv();

    getBooks();


    return view;
}



private void init(View view) {

    bookListRv = view.findViewById(R.id.bookRVId);
    firebaseAuth = firebaseAuth.getInstance();
    databaseReference = FirebaseDatabase.getInstance().getReference();
    bookList = new ArrayList<>();
    bookAdapter = new BookAdapter(bookList, getContext());
}

private void configRv() {
    bookListRv.setLayoutManager(new LinearLayoutManager(getContext()));
    bookListRv.setAdapter(bookAdapter);
}

private void getBooks(){
    DatabaseReference showBookRef = databaseReference.child("Books").child(adminId);

    showBookRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot data:dataSnapshot.getChildren()){
                    Book book = data.child("BookInfo").getValue(Book.class);
                    bookList.add(book);
                    bookAdapter.notifyDataSetChanged();
                }
            }
        }

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

        }
    });


}

任何帮助我得到赞赏的人

1 个答案:

答案 0 :(得分:1)

观察

  1. 在管理应用中,您在管理UID下上传BookInfo-oJ26Q...G3
  2. 在“用户”应用中,您尝试使用用户UID-BookInfo
  3. 来获取此0FX6M...

结论

  1. 这意味着您无法使用用户UID访问BookInfo
  2. 如果您知道管理员UID,则可以从用户应用程序访问它。

可能的解决方案: 将BookInfo上载到一个公共位置[与用户无关],以便每个用户在管理员上载后都可以访问BookInfo

然后按以下方式查询它:

databaseReference.child("Books").addValueEventListener

当前情况下的解决方法: 您必须使用adminId进行硬编码才能获得BookInfo。检查以下内容:

private void getBooks(){
    DatabaseReference showBookRef = databaseReference.child("Books").child("oJ26QDoFZBWAgWjxbFOX5jv1tcG3");

    showBookRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot data:dataSnapshot.getChildren()){
                    Book book = data.child("BookInfo").getValue(Book.class);
                    bookList.add(book);
                    bookAdapter.notifyDataSetChanged();
                }
            }
        }

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

        }
    });
}