搜索Firebase数据库

MAF:

前言:

为了使这个问题有意义,我需要描述我对数据库的意图。它将用于存储纬度和经度扇区网格的用户数据,这些网格是通过在用户注册或登录时查找用户确切坐标的底值而创建的。然后将缩减后的坐标值合并起来,保存在共享首选项中在用户的电话上,然后设置为数据库中的主节点。这允许通过数据库搜索仅限于用户当前所在的部门,而该部门是应用程序功能所必需的。请参见以下示例数据库的节点布局:

在此处输入图片说明

问题:

该系统运行良好,除了用户从原始扇区之外或先前扇区登录新设备(或如果共享首选项丢失)时,无法知道先前或原始扇区的值。

答案:

我想到的答案是在数据库中的每个单个扇区节点上搜索唯一的uid,可通过以下代码轻松获取:

FirebaseAuth mAuth = FirebaseAuth.getInstance()
String currentUser = mAuth.getCurrentUser().getUid();

但是,我不知道如何在数据库中为特定孩子搜索每个节点(可能有数千个,因为有数千个潜在扇区)请注意,每个主节点都有一个不同的名称,但是它们都包含子“用户”,这些子可以包含任意数量的子“ uid”。

在前一个扇区节点中找到当前uid后,我的意图是将前一个扇区中当前uid的所有子代都转移到新的uid。我也想避免整个uid在本地遍历整个数据库。

private DatabaseReference userRef = FirebaseDatabase.getInstance().getReference();

mLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String email = mEmail.getText().toString();
                final String password = mPassword.getText().toString();
                final String currentUserId = mAuth.getUid();
                mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            Toast.makeText(LoginActivity.this, "sign in error", Toast.LENGTH_SHORT);
                        } else {
                            if (task.isSuccessful()){
                                userRef.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                                    }

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

                                    }
                                })
                            }
                        }
                    }
                });
            }
        });

如上所述,所有这些都需要在登录事件成功之后发生。我有为此需要使用dataSnapshot的感觉,但不确定。我还阅读了另一篇文章,并认为以下内容可能是可行的开始,但我不知道:

Query searchQuery = userRef.child("Users").equalTo(currentUserId); 

查询的流程应为:搜索第一个节点 ->导航到用户->遍历currentUid->如果未找到currentUid,则搜索第二个节点 ...依此类推,直到找到currentUid 。

如果有人有答案或任何建议,指导或提示,我将不胜感激。谢谢。

弗兰克·范普菲伦:

Firebase数据库查询在路径中只能包含一个未知级别。您当前的结构不允许您在所有部门中搜索特定用户。您可以在一个部分中跨所有用户搜索,但不能跨部门搜索。

因此,虽然您当前的代码使查找特定扇区甚至扇区范围内的所有用户变得容易,但是却不容易为特定用户查找扇区。为了允许后一种用例,您需要为此添加一个附加的数据结构。通常是这样的:

"user-locations": {
  "$uid": "
    "sector": "37-123",
    "location": "..."
  }
}

因此,这意味着当用户移动时,您需要在两个位置更新其位置。

这种数据重复在NoSQL数据库中很常见,您需要在其中更新数据模型以允许用例。为了使读取操作更简单和更具可伸缩性,更复杂的写入操作也很常见。

有关此的更多信息,请参阅我的答案:

和:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章