You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:48:25