You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Android已认证用户关联实时数据库问题咨询

解决Firebase认证用户与实时数据库关联的问题

嘿,很高兴帮你搞定这个需求!你已经完成了最基础的连接工作,接下来只需要把用户的**唯一认证ID(UID)**和他们的儿童数据绑定,就能实现用户只能查看自己输入的内容啦,我分步骤给你讲:

一、存储儿童数据时关联用户UID

首先,在你的addChild类里,我们需要在用户输入儿童姓名后,把数据存在以当前用户UID为标识的数据库节点下,这样数据和用户就一一对应了。

代码示例(Android):

// 获取Firebase认证实例和数据库引用
FirebaseAuth mAuth = FirebaseAuth.getInstance();
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();

// 获取当前登录用户
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null) {
    String userId = currentUser.getUid(); // 获取用户唯一UID
    String childName = editText.getText().toString().trim(); // 获取输入的儿童姓名

    if (!childName.isEmpty()) {
        // 把儿童数据存入"users/[用户UID]/children"节点下
        // 用push()可以生成唯一ID,方便存储多个儿童
        mDatabase.child("users").child(userId).child("children").push().setValue(childName);
        
        // 存储成功后的提示,比如Toast
        Toast.makeText(this, "儿童姓名已保存", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(this, "请输入儿童姓名", Toast.LENGTH_SHORT).show();
    }
} else {
    // 如果用户未登录,引导到登录页面
    Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show();
    startActivity(new Intent(this, LoginActivity.class));
}

二、登录后加载当前用户的儿童数据

用户登录成功后,你需要从数据库中读取对应UID节点下的儿童数据,然后展示出来(比如用TextView或者RecyclerView)。

代码示例(登录后的主页):

FirebaseAuth mAuth = FirebaseAuth.getInstance();
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();

FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null) {
    String userId = currentUser.getUid();
    // 监听"users/[用户UID]/children"节点的数据变化
    mDatabase.child("users").child(userId).child("children").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // 清空之前的内容
            childNameTextView.setText("");
            
            // 遍历所有儿童数据
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                String childName = snapshot.getValue(String.class);
                // 把姓名拼接显示,或者添加到列表里
                childNameTextView.append(childName + "\n");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // 处理读取失败的情况
            Toast.makeText(MainActivity.this, "加载数据失败: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

三、关键:配置数据库安全规则

为了保证每个用户只能访问自己的数据,一定要在Firebase控制台的实时数据库规则里设置权限:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null && auth.uid === $uid",
        ".write": "auth != null && auth.uid === $uid"
      }
    }
  }
}

这个规则的意思是:只有登录用户(auth != null)且当前用户的UID等于节点的$uid时,才能读写该节点下的数据,完美实现数据隔离。

小提示

  • 如果用户可能添加多个儿童,用push()生成唯一子节点是最佳实践,避免覆盖之前的数据。
  • 记得处理用户未登录的情况,比如在addChild类启动时先检查用户是否登录,没登录就跳转到登录页。

内容的提问来源于stack exchange,提问作者user12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:04:50