【问题标题】:Problems with Querying data from Firebase Database从 Firebase 数据库查询数据的问题
【发布时间】:2022-02-19 20:54:40
【问题描述】:

我正在努力获取来自DatabaseQuery 数据。 我的代码以某种方式工作,但我必须关闭屏幕并打开手机才能让数据显示在我的 ListView 中。TextView tvuserstorage 是我想用来过滤我的 @ 的值987654327@ 之后。我有另一个Activity,而我没有Query,这在同一个Database 上工作得很好。

希望有人能看到我做错了什么。

这是我的代码:

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

    databaseUsers = FirebaseDatabase.getInstance("").getReference("Ansatte");
    databaseTools = FirebaseDatabase.getInstance("").getReference("Verktøy");

    mAuth = FirebaseAuth.getInstance();
    user = FirebaseAuth.getInstance().getCurrentUser();
    userID = user.getUid();

    tvuserstorage = (TextView) findViewById(R.id.tv_userstorage);
    svusertoollist = (SearchView) findViewById(R.id.sv_usertoollist);
    lvusertoollist = (ListView) findViewById(R.id.lv_usertoollist);

    usertoollist = new ArrayList<>();
    databaseUsers.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            Users userprofile = snapshot.getValue(Users.class);

            if (userprofile != null) {
                String user = userprofile.getUserStorage();
                tvuserstorage.setText(user);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) { }
    });
}

@Override
protected void onStart() {
    super.onStart();

    Query userlist = databaseTools.orderByChild("toolOwnerStorage").equalTo(tvuserstorage.getText().toString());

    userlist.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            usertoollist.clear();

            for (DataSnapshot snapshot1 : snapshot.getChildren()){
                Tools tools = snapshot1.getValue(Tools.class);

                usertoollist.add(tools);
            }

            ToolList adapter = new ToolList(UserToolListActivity.this, usertoollist);
            lvusertoollist.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) { }
    });
}

这是我在使用 userID 之前的日志:

I/TAG: xOPruRmASVcwlkEwr8Xr2mlCygw2

这是我的 Firebase 结构:

"Ansatte" : {
  "xOPruRmASVcwlkEwr8Xr2mlCygw2" : {
   "hasUserStorage" : "Ja",
   "userAdmin" : "Nei",
   "userDivision" : "Elektro",
   "userEmail" : "booby@bob.com",
   "userName" : "Bobby",
   "userStorage" : "220"
 },
 "Ak2hetTTcRMLlapYHDZnTqUM1Ch2" : {
   "hasUserStorage" : "Nei",
   "userAdmin" : "Nei",
   "userDivision" : "Blikk",
   "userEmail" : "teddy@ted.com",
   "userName" : "Teddy",
   "userStorage" : ""
"Verktøy" : {
  "3" : {
    "toolGroup" : "",
    "toolName" : "Wrench",
    "toolOwner" : "",
    "toolOwnerStorage" : "220",
    "toolQRid" : "3",
    "toolStatus" : "",
    "toolType" : "",
    "toolrenteddate" : ""
  },
  "1" : {
    "toolGroup" : "",
    "toolName" : "Pliers",
    "toolOwner" : "",
    "toolOwnerStorage" : "225",
    "toolQRid" : "1",
    "toolStatus" : "",
    "toolType" : "",
    "toolrenteddate" : "" 

所以这就是我想要发生的事情: 当用户"xOPruRmASVcwlkEwr8Xr2mlCygw2" 登录时,我只想显示来自Verktøychild("toolOwnerStorage) 的数据等于Ansattechild("userStorage)。在某种程度上它适用于我发布的代码,但我必须打开和关闭屏幕才能显示它。但如果我拿走Query,它会显示一切都没有任何问题。

【问题讨论】:

  • 请不要在此处传递空字符串:FirebaseDatabase.getInstance("")。我很惊讶它甚至可以执行,但如果它确实执行了:如果您不需要在那里指定数据库 URL,只需不要传递任何值:FirebaseDatabase.getInstance()
  • 嗨弗兰克,我没有传递一个空字符串,我刚刚为这篇文章删除了它。
  • 好的?? --- 您能否在databaseUsers.child(userID) 下显示您的数据库中存在哪些数据(作为文本,请不要截图)。您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。 --- 你可以在使用userID 访问数据库之前记录并显示它的值吗? --- 如果你在onDataChange 内的第一行放置一个断点并在调试器中运行,它会到达该行吗?
  • 请编辑您的问题并添加弗兰克要求的信息,也请回复@。
  • @FrankvanPuffelen ,我添加了更多信息。希望你能帮我解决这个问题。

标签: java android firebase-realtime-database


【解决方案1】:

我想通了,希望这是一个好的解决方案。 我把Query 放在addListener 里面。现在它可以工作了。

databaseUsers.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            Users userprofile = snapshot.getValue(Users.class);

            if (userprofile != null) {

                String user = userprofile.getUserStorage();

                tvuserstorage1.setText(user);

                Query userlist = databaseTools.orderByChild("toolOwnerStorage").equalTo(user);

                userlist.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        toolListData.clear();
                        for (DataSnapshot snapshot1 : snapshot.getChildren()){

                            Tools data = snapshot1.getValue(Tools.class);
                            toolListData.add(data);

                        }


                        sharedToolsAdapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) { }
                });


                //Log.d("TAG", user);
            }

        }

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

        }

    });



}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多