【问题标题】:Searching a firebase database搜索 Firebase 数据库
【发布时间】:2020-06-23 01:12:05
【问题描述】:

前言:

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

问题:

这个系统工作得很好,除了当用户在新设备上登录时(或者如果共享偏好丢失)从原始扇区之外,或者从前一个扇区,没有办法知道前一个或原始扇区值。

答案:

我想出的答案是在数据库中的每个扇区节点中搜索唯一的uid,通过以下代码很容易获得:

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

但是,我不知道如何搜索每个节点(其中可能有数千个,因为有数千个潜在扇区)在数据库中为特定的孩子。请注意,每个主节点都有不同的名称,但它们都包含子“用户”,然后可以保存任意数量的子“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。

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

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

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

    因此,虽然您当前的代码可以很容易地找到特定部门甚至部门范围内的所有用户,但它并不容易找到特定用户的部门。要允许后一种用例,您需要为此添加一个额外的数据结构。通常是这样的:

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

    这意味着当用户移动时,您需要在两个地方更新他们的位置。

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

    有关这方面的更多信息,请参阅我的回答:

    还有:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多