【发布时间】: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