Firebase Realtime Database传入URL与配置地址不匹配报错排查
在项目SignUpActivity中尝试向Firebase Realtime Database传输用户数据时,复制Realtime Database控制台展示的URL创建DatabaseReference实例,编写代码如下:
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl("https://quiz-project-6afd9-default-rtdb.europe-west1.firebasedatabase.app/");
应用启动时直接触发Fatal exception,核心报错信息为:传入getReference()的URL无效,传入URL需匹配项目已配置的Database URL,当前传入地址为https://quiz-project-6afd9-default-rtdb.europe-west1.firebasedatabase.app/,配置期望的地址为https://quiz-project-6afd9-default-rtdb.firebaseio.com。
完整运行异常日志如下:
2022-06-21 14:50:24.921 8323-8323/com.dinocodeacademy.maingoquizagain E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dinocodeacademy.maingoquizagain, PID: 8323
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.dinocodeacademy.maingoquizagain/com.dinocodeacademy.com.SignUp}: com.google.firebase.database.DatabaseException: Invalid URL (https://quiz-project-6afd9-default-rtdb.europe-west1.firebasedatabase.app/) passed to getReference(). URL was expected to match configured Database URL: https://quiz-project-6afd9-default-rtdb.firebaseio.com
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: com.google.firebase.database.DatabaseException: Invalid URL (https://quiz-project-6afd9-default-rtdb.europe-west1.firebasedatabase.app/) passed to getReference(). URL was expected to match configured Database URL: https://quiz-project-6afd9-default-rtdb.firebaseio.com
at com.google.firebase.database.FirebaseDatabase.getReferenceFromUrl(FirebaseDatabase.java:214)
at com.dinocodeacademy.com.SignUp.(SignUp.java:34)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2022-06-21 14:50:24.969 8323-8323/com.dinocodeacademy.maingoquizagain I/Process: Sending signal. PID: 8323 SIG: 9
- 项目中存放的Firebase配置文件(Android端为app目录下的
google-services.json)记录的Realtime Database地址,和代码里硬编码传入的地址不匹配,SDK初始化校验时直接抛出异常。 - 这类问题基本都是两种场景触发:一是在Firebase控制台新建了指定欧洲区域的Realtime Database实例后,没有重新下载最新的配置文件替换项目里的旧文件;二是直接复制了控制台显示的新区域库地址,但本地配置默认关联的还是最早创建的美国中心默认库,两边域名后缀对不上。
- 报错信息已经明确标注差异:配置默认的地址是美国区默认域名后缀
*.firebaseio.com,代码传入的是欧洲区的新域名后缀*.firebasedatabase.app,地址校验不通过就会触发致命崩溃。
根据自身业务场景选任意一种方案处理即可:
- 最稳妥的通用方案(规避硬编码风险):不要手动硬编码数据库URL,SDK会自动读取本地配置文件里预置的地址,代码直接修改为:
如果业务本来就要使用欧洲区的库存放数据,直接去Firebase控制台的项目设置页,重新下载最新的// 自动读取本地google-services.json中的配置地址,无需手动传参 DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();google-services.json文件,替换掉项目app目录下的旧配置文件,重新同步依赖编译运行即可。 - 临时快速修复方案:直接把代码里硬编码的URL替换为报错提示中给出的期望配置地址:
注意:如果实际业务数据是存储在欧洲区的新库中,用这个方法会连接到最早创建的美国区默认库,后续会出现写入数据查询不到的问题,这种场景必须使用第一种方案更新配置文件。DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl("https://quiz-project-6afd9-default-rtdb.firebaseio.com"); - 多库访问场景方案:如果需要在同一个App内访问多个不同区域的Realtime Database实例,给每个库单独调用
FirebaseDatabase.getInstance(对应库的URL)初始化实例即可,同时要给对应库配置正确的读写权限规则。
内容的提问来源于stack exchange,提问作者YakovMashin

