Firebase插入数据时触发NoSuchMethodError崩溃问题求助
解决Firebase
NoSuchMethodError: setTokenProvider 崩溃问题 这个问题我之前也碰到过,核心原因是你的Firebase各组件版本严重不兼容——不同Firebase库的版本差异太大,导致内部类方法不匹配,触发了NoSuchMethodError。咱们一步步来修复:
1. 用Firebase BoM统一管理所有Firebase组件版本
Firebase提供了Bill of Materials(BoM)工具,能自动确保所有Firebase库使用兼容的版本,避免手动指定版本带来的冲突。修改你的build.gradle(Module级别):
修改后的dependencies部分:
dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.android.material:material:1.0.0' // 引入Firebase BoM,统一管理版本 implementation platform('com.google.firebase:firebase-bom:28.4.2') // 移除单独指定版本的Firebase组件,使用BoM自动匹配版本 implementation 'com.google.firebase:firebase-database' implementation 'com.google.firebase:firebase-auth' implementation 'com.google.firebase:firebase-storage' // FirebaseUI版本需要和Firebase版本兼容,这里选用适配BoM的版本 implementation 'com.firebaseui:firebase-ui-auth:7.2.0' implementation 'androidx.navigation:navigation-fragment:2.3.0' implementation 'androidx.navigation:navigation-ui:2.3.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.android.support:cardview-v7:28.0.0' // 避免使用+号,指定具体稳定版本 testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
注意:
firebase-bom的版本可以选择最新稳定版,FirebaseUI的版本要和BoM对应的Firebase版本匹配,这里选7.2.0是因为它适配Firebase 28.x系列。
2. 清理构建缓存并重新编译
版本调整后,需要清理旧的构建缓存,避免残留的不兼容类:
- 在Android Studio中点击
Build > Clean Project - 然后点击
Build > Rebuild Project
3. 修复Marks.java中的小问题(非崩溃原因,但影响功能)
你的代码里有两处小错误,虽然不会导致崩溃,但会影响数据插入:
- 所有空值判断的Toast提示都是
"Empty year",应该对应不同的字段 - 重复调用了
rslt.setMarks(...),这里应该是rslt.setGpa(...)(假设你的Result类有setGpa方法)
修正后的点击事件代码片段:
add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dbref = FirebaseDatabase.getInstance().getReference().child("Marks"); try { if(TextUtils.isEmpty(year.getText().toString())) Toast.makeText(getApplicationContext(),"Empty year",Toast.LENGTH_SHORT).show(); else if(TextUtils.isEmpty(mark.getText().toString())) Toast.makeText(getApplicationContext(),"Empty mark",Toast.LENGTH_SHORT).show(); else if(TextUtils.isEmpty(subject.getText().toString())) Toast.makeText(getApplicationContext(),"Empty subject",Toast.LENGTH_SHORT).show(); else if(TextUtils.isEmpty(semester.getText().toString())) Toast.makeText(getApplicationContext(),"Empty semester",Toast.LENGTH_SHORT).show(); else if(TextUtils.isEmpty(gpa.getText().toString())) Toast.makeText(getApplicationContext(),"Empty GPA",Toast.LENGTH_SHORT).show(); else { rslt.setYear(Integer.parseInt(year.getText().toString().trim())); rslt.setMarks(Integer.parseInt(mark.getText().toString().trim())); rslt.setSubjects(subject.getText().toString().trim()); rslt.setSemester(semester.getText().toString().trim()); rslt.setGpa(Integer.parseInt(gpa.getText().toString().trim())); dbref.child("mrk1").setValue(rslt); Toast.makeText(getApplicationContext(),"Inserted Successfully!",Toast.LENGTH_SHORT).show(); clearcontrol(); } } catch(NumberFormatException e) { Toast.makeText(getApplicationContext(),"Invalid input! Please enter numbers for year, mark and GPA",Toast.LENGTH_SHORT).show(); } } });
完成以上步骤后,你的应用应该就能正常连接Firebase并插入数据了。
内容的提问来源于stack exchange,提问作者Buddhika Senanayaka
相关产品推荐
相关产品推荐

