Kotlin开发Firebase实时数据库数据无法上传排查求助
问题:Firebase实时数据库数据无法上传显示
我无法查明为何数据无法显示在Firebase实时数据库中。调试后发现链接正常,数据似乎按预期保存,但上传到服务器时毫无反应。
项目采用Kotlin开发,使用Firebase实时数据库,且已修改Firebase的读写权限。请问我哪里出错了?该如何修改才能正常运行?
相关代码
Activity逻辑代码
class AddItemToDataBasePage : AppCompatActivity() { private lateinit var etName : EditText private lateinit var etBrand : EditText private lateinit var etType : EditText private lateinit var etPrice : EditText private lateinit var etAmount: EditText lateinit var addBtn : Button private lateinit var dbRef : DatabaseReference override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_item_to_data_base_page) //Linking to var to buttons so we cab get the data etName = findViewById(R.id.addItemName) etBrand = findViewById(R.id.addItemBrand) etType = findViewById(R.id.addItemType) etPrice = findViewById(R.id.addItemPrice) etAmount = findViewById(R.id.addItemAmount) addBtn = findViewById(R.id.addItemButton) // DB Reference dbRef = FirebaseDatabase.getInstance().getReference("Items") addBtn.setOnClickListener(){ addingItems() } } private fun addingItems() { val name = etName.text.toString() val brand = etBrand.text.toString() val type = etType.text.toString() val price = etPrice.text.toString() val amount = etAmount.text.toString() if ( name.isEmpty() && brand.isEmpty() && type.isEmpty() && price.isEmpty() && amount.isEmpty()){ Toast.makeText(this,"Please fill all areas", Toast.LENGTH_LONG).show() } if ( name.isNotEmpty() && brand.isNotEmpty() && type.isNotEmpty() && price.isNotEmpty() && amount.isNotEmpty()){ val itemsData = ItemsDataModel(name,brand,type,price,amount) dbRef.child(name).setValue(itemsData).addOnSuccessListener { etName.text.clear() etBrand.text.clear() etType.text.clear() etPrice.text.clear() etAmount.text.clear() Toast.makeText(applicationContext,"Item Added Successfully",Toast.LENGTH_LONG).show() }.addOnFailureListener{ Toast.makeText(applicationContext,"Failed To add Item",Toast.LENGTH_LONG).show() } } } }
模块级Gradle依赖
dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.5.0' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.annotation:annotation:1.4.0' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' implementation 'com.google.firebase:firebase-database-ktx:20.0.6' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation platform('com.google.firebase:firebase-bom:30.2.0') implementation 'com.google.firebase:firebase-analytics-ktx' // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.4.1') // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-auth-ktx' // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.3.0' }
项目级Gradle配置
buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.google.gms:google-services:4.3.13' } } plugins { id 'com.android.application' version '7.2.2' apply false id 'com.android.library' version '7.2.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.10' apply false } task clean(type: Delete) { delete rootProject.buildDir }
问题排查与修复方案
1. 输入验证逻辑漏洞
当前addingItems()的验证逻辑存在严重问题:只有所有字段全空或所有字段全填时才会触发逻辑,若用户漏填单个字段,两个if条件都不满足,代码会直接跳过上传且无任何提示。
修复后的验证逻辑:
private fun addingItems() { val name = etName.text.toString().trim() val brand = etBrand.text.toString().trim() val type = etType.text.toString().trim() val price = etPrice.text.toString().trim() val amount = etAmount.text.toString().trim() // 逐一检查字段,为空则提示并终止上传 when { name.isEmpty() -> etName.error = "请输入名称" brand.isEmpty() -> etBrand.error = "请输入品牌" type.isEmpty() -> etType.error = "请输入类型" price.isEmpty() -> etPrice.error = "请输入价格" amount.isEmpty() -> etAmount.error = "请输入数量" else -> { // 所有字段合法,执行上传 val itemsData = ItemsDataModel(name, brand, type, price, amount) dbRef.child(name).setValue(itemsData).addOnSuccessListener { etName.text.clear() etBrand.text.clear() etType.text.clear() etPrice.text.clear() etAmount.text.clear() Toast.makeText(applicationContext, "物品添加成功", Toast.LENGTH_LONG).show() }.addOnFailureListener { e -> // 打印错误日志,精准定位问题 Log.e("FirebaseError", "上传失败: ${e.message}") Toast.makeText(applicationContext, "添加失败: ${e.message}", Toast.LENGTH_LONG).show() } } } }
2. Firebase依赖版本冲突
模块级Gradle中重复引入了两个不同版本的Firebase BOM(30.2.0和30.4.1),会导致依赖版本混乱,引发数据库操作异常。
修复后的依赖配置:
dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.5.0' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.annotation:annotation:1.4.0' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' // 只保留最新版本的BOM,统一管理Firebase依赖版本 implementation platform('com.google.firebase:firebase-bom:30.4.1') implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-database-ktx' implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.google.android.gms:play-services-auth:20.3.0' }
3. 数据模型类规范
Firebase序列化对象需要类具备默认无参构造函数,且字段需为公开或有getter方法,确保ItemsDataModel符合要求:
data class ItemsDataModel( var name: String? = null, var brand: String? = null, var type: String? = null, var price: String? = null, var amount: String? = null )
4. 数据库配置确认
- 检查Firebase控制台的实时数据库读写权限,测试阶段可暂时设置为:
{ "rules": { ".read": true, ".write": true } } - 若数据库部署在非美地区,需初始化时指定数据库URL:
dbRef = FirebaseDatabase.getInstance("你的数据库URL").getReference("Items")
内容的提问来源于stack exchange,提问作者JeanMI
相关产品推荐
相关产品推荐

