如何为Firebase Database子节点声明字符串值及点击按钮保存不同子节点数据
实现按钮点击时创建唯一子节点保存数据
首先得指出你原代码里的两个关键问题:一是用了addValueEventListener,这是用来实时监听数据库数据变化的,并不是响应按钮点击的逻辑;二是child()方法里没有指定节点名称,直接调用setValue会覆盖掉Location节点下的现有数据,根本没法生成不同的子节点。
要实现点击按钮就保存数据,且每个子节点唯一的需求,你可以按照下面的思路修改:
核心解决思路
- 把数据保存的逻辑从监听事件中移到按钮的点击监听器里,这样只有点击按钮时才会执行保存操作
- 用Firebase官方推荐的
push()方法自动生成唯一子节点ID,或者手动用时间戳、UUID生成唯一节点名称
修改后的代码示例
方法1:用Firebase的push()生成唯一节点(推荐)
push()会基于时间戳+随机数生成永不重复的节点ID,是Firebase官方最推荐的生成唯一子节点的方式,代码也最简洁:
// 先获取你的按钮实例(假设按钮的id是btn_save_location) Button saveBtn = findViewById(R.id.btn_save_location); // 给按钮设置点击监听器 saveBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取到Location节点的数据库引用 DatabaseReference locationRef = FirebaseDatabase.getInstance().getReference("Location"); // 创建要保存的myLocation对象 myLocation locationDB = new myLocation(lang1, long1); // 用push()生成唯一子节点,然后保存数据 locationRef.push().setValue(locationDB); } });
方法2:手动生成唯一节点名(比如时间戳)
如果你想自己控制节点名称,比如用当前时间戳作为唯一标识,也可以这么写:
Button saveBtn = findViewById(R.id.btn_save_location); saveBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatabaseReference locationRef = FirebaseDatabase.getInstance().getReference("Location"); // 用当前系统时间戳生成唯一节点名 String uniqueNodeId = String.valueOf(System.currentTimeMillis()); myLocation locationDB = new myLocation(lang1, long1); // 指定子节点名称后保存数据 locationRef.child(uniqueNodeId).setValue(locationDB); } });
补充说明
- 确保你的
myLocation类有默认无参构造方法,并且所有字段都有public的getter方法,否则Firebase无法正确序列化对象到数据库 - 原代码中的
orderByChild("previousLocation")监听逻辑如果不是你需要的实时监听,可以直接移除,因为我们现在是通过按钮点击触发保存,不需要实时监听数据变化
内容的提问来源于stack exchange,提问作者David Adam
相关产品推荐
相关产品推荐

