Android端Firebase Realtime Database数据无法插入无报错如何解决?
Android Java接入Firebase Realtime Database写入操作无回调无数据写入问题排查
问题现象
使用Android Java编写Firebase Realtime Database插入数据代码,点击上传按钮响应正常,但Firebase相关代码未执行,无数据插入相关错误/警告提示,多项目测试相同代码均无效,SuccessListener和FailureListener均无回调,数据库无变化。
相关代码
按钮点击逻辑
public void onClick(View v) { if(v.getId()==uploadBtn.getId()){ DatabaseReference ref= FirebaseDatabase.getInstance().getReference().child("Users"); TestModel tm=new TestModel("Angela","angela@123"); ref.child("Angela").setValue(tm).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d("app","data inserted"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.d("app","failed to inserted: "+e.getMessage()); } }); }
TestModel实体类
public class TestModel { public String name,passwd; public TestModel(String name, String passwd) { this.name = name; this.passwd = passwd; } }
配置信息
数据库规则
"rules": { ".read": true, ".write":true }
初始数据库节点结构
first-app-default-rtdb:null
项目级build.gradle
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:7.0.2' classpath 'com.google.gms:google-services:4.3.10' } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
应用级build.gradle
apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.simpleapp" minSdkVersion 26 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.firebase:firebase-database:20.0.1' testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
已尝试未生效的解决方案
- 升级Android Studio到2020.3版本
- 为实体类添加Getter和Setter方法
- 新建项目测试相同代码
- 测试查询、更新、删除操作均无效
- 手动添加google-services.json配置文件
- 更换新的Google账号关联项目
- 在真机和7.0-11版本的模拟器上测试应用
- 多次清理项目,移除后重新添加Firebase依赖
- 项目迁移到Android Jetpack
- 分别使用VPN和普通网络测试
- 升级Gradle插件到最新版本
- 更换测试设备,调整minSdk和targetSdk版本
- 关闭杀毒软件,禁用系统防火墙
- 修改Firebase数据库读写规则
- 代码中显式添加数据库URL路径
排查建议
- 首先确认AndroidManifest.xml中是否已添加网络权限,权限缺失会直接导致Firebase网络请求被静默拦截无回调:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 给TestModel类补充公共无参构造方法,Firebase SDK序列化/反序列化实体类必须要求存在无参构造方法,否则会出现静默失败的情况,修改后的参考代码:
public class TestModel { public String name,passwd; // 补充无参构造方法 public TestModel() { } public TestModel(String name, String passwd) { this.name = name; this.passwd = passwd; } }
- 开启Firebase Debug日志,在Application的onCreate方法中添加如下代码,查看底层请求日志定位具体问题:
FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG);
- 确认google-services.json中的
firebase_url字段和你的数据库实际地址完全一致,避免因为数据库部署地域不同导致请求地址错误。 - 检查测试设备上Google Play服务的网络权限是否正常开启,部分国产设备会默认禁用Google Play服务的网络权限,直接导致Firebase请求无法发送。
内容的提问来源于stack exchange,提问作者Nikita K
相关产品推荐
相关产品推荐

