Java安卓开发Firebase数据库无法保存音频元数据问题求助
问题描述
我正在从Firebase Storage下载音频的名称与URL,下载环节执行正常,但对应数据无法上传至Firebase Database。
数据下载上传逻辑
StorageReference reference = storage.getReference().child("Ringtone"); reference.listAll().addOnSuccessListener(listResult -> { Log.d("Tag","reference listed"); for(StorageReference item:listResult.getItems()){ Task<Uri> downloadUrlTask = item.getDownloadUrl(); Task<StorageMetadata> downloadNameTask = item.getMetadata(); Tasks.whenAll(downloadNameTask,downloadUrlTask).addOnSuccessListener(unused -> { Methods methods = new Methods(); methods.firebse_ring_upload(downloadNameTask.getResult().getName(),downloadUrlTask.getResult()); }); } });
Method类代码
package com.example.alarm.Methods; import android.net.Uri; import android.util.Log; import com.example.alarm.Models.RingtoneModel; import com.google.firebase.database.FirebaseDatabase; public class Methods { FirebaseDatabase database = FirebaseDatabase.getInstance(); public void firebse_ring_upload(String songName, Uri uri){ RingtoneModel ringtoneModel = new RingtoneModel(songName,uri.toString()); database.getReference().child("Ringtones_Room").child(songName.replace(" ","").replaceAll("[\\W+]","")).setValue(ringtoneModel); } }
RingtoneModel(POJO类)代码
package com.example.alarm.Models; import android.net.Uri; public class RingtoneModel { String SongName; String uri; public RingtoneModel(String songName, String uri) { SongName = songName; this.uri = uri; } public RingtoneModel(){} public String getSongName() { return SongName; } public void setSongName(String songName) { SongName = songName; } public String getUri() { return uri; } public void setUri(Uri uri) { this.uri = uri.toString(); } }
此前代码因尝试直接存储URI对象抛出StackOverflow错误,修改为将URI转成字符串存储后不再抛出任何错误,但数据仍然没有写入数据库。
更新补充
我按如下方式修改了Method类中的方法:(method类内)
public void firebse_ring_upload(String songName, Uri uri){ RingtoneModel ringtoneModel = new RingtoneModel(songName,uri.toString()); database.getReference("https://alarm-sachinbudak-default-rtdb.asia-southeast1.firebasedatabase.app/").child("Ringtones_Room").child(songName.replaceAll("[\\W+]","")).setValue(ringtoneModel); }
修改后抛出新的报错:
com.google.firebase.database.DatabaseException: Invalid Firebase Database path: https://alarm-sachinbudak-default-rtdb.asia-southeast1.firebasedatabase.app/. Firebase Database paths must not contain '.', '#', '$', '[', or ']' at com.google.firebase.database.core.utilities.Validation.validatePathString(Validation.java:45) at com.google.firebase.database.core.utilities.Validation.validateRootPathString(Validation.java:58) at com.google.firebase.database.FirebaseDatabase.getReference(FirebaseDatabase.java:181) at com.example.alarm.Methods.Methods.firebse_ring_upload(Methods.java:14) at com.example.alarm.MainActivity.lambda$onCreate$3(MainActivity.java:85)

解决方案
1. 路径错误修复
getReference()方法仅接收数据库内部的相对路径,不支持传入完整数据库URL,你使用的是非美区节点,需要在初始化FirebaseDatabase实例时传入完整URL:
修改Method类中的数据库初始化代码:
FirebaseDatabase database = FirebaseDatabase.getInstance("https://alarm-sachinbudak-default-rtdb.asia-southeast1.firebasedatabase.app/");
后续调用getReference()时直接传入相对路径Ringtones_Room即可。
2. 无报错也无法写入数据的排查
- 检查数据库权限规则,调试阶段可以先开放测试权限验证写入功能:
{ "rules": { ".read": true, ".write": true } }
- 给setValue操作添加回调打印错误信息,方便定位具体问题:
database.getReference().child("Ringtones_Room").child(songName.replace(" ","").replaceAll("[\\W+]","")) .setValue(ringtoneModel) .addOnSuccessListener(aVoid -> Log.d("DB_WRITE", "写入成功")) .addOnFailureListener(e -> Log.e("DB_WRITE", "写入失败", e));
- 补充POJO类的setter方法避免序列化异常,新增String参数的setUri方法:
public void setUri(String uri) { this.uri = uri; }
内容的提问来源于stack exchange,提问作者Sachin Burdak
相关产品推荐
相关产品推荐

