java - 无法将数据上传到实时 Firebase
问题描述
我是使用实时数据库的新手,并决定构建一个还包含用户注册和登录的项目。为此我使用了firebase autentication系统,但因为它只使用电子邮件和密码,我想在实时数据库中保留更多信息,这样我就可以使用给每个用户的uid来访问它。
注册过程运行良好,我可以在 firebase autentication 中看到新用户,但由于某种原因,我不明白,无论我尝试什么,我尝试保存的额外信息都不会上传到数据库中。
这是我写的代码
public void tryRegister(View view){
authService.createUserWithEmailAndPassword
(this.email.getText().toString(),this.password.getText().toString())
.addOnCompleteListener(this, task -> {
if (task.isSuccessful()){
String uid = authService.getCurrentUser().getUid();
Map<String, String> userDetails = new HashMap<String, String>();
userDetails.put("username", this.username.getText().toString());
DatabaseReference usersInfo = database.getReference("usersInfo");
usersInfo.child(uid).setValue(userDetails);
setResult(RESULT_OK);
finish();
}
else{
this.failedReg.setText("error in the registration process");
}
});
}
应用级依赖:
dependencies {
implementation platform('com.google.firebase:firebase-bom:28.3.1')
implementation 'com.google.firebase:firebase-analytics'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.firebase:firebase-auth:21.0.1'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation platform('com.google.firebase:firebase-bom:28.3.1')
implementation 'com.google.firebase:firebase-database'}
解决方案
当我执行您的代码时,数据会毫无问题地添加到实时数据库中。
我猜你没有write
在你的 Firebase 设置中授予访问权限。请检查您是否write
在您的规则部分提供了访问权限,如下所示
供您参考,我添加了工作代码。
我刚刚addOnCompleteListener()
将数据添加到数据库中。因此,finish()
只有在数据成功添加到数据库时,该应用程序才会调用。
这也可能是您的问题。因为向实时数据库添加任何值都是异步发生的。在将数据添加到数据库之前关闭应用程序可能会失败。
public class MainActivity extends AppCompatActivity {
private FirebaseAuth firebaseAuth;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
firebaseAuth = FirebaseAuth.getInstance ();
Button signIn = findViewById ( R.id.button );
signIn.setOnClickListener ( v -> tryRegister () );
}
public void tryRegister () {
firebaseAuth.createUserWithEmailAndPassword ( "test@gmail.com", "password" )
.addOnCompleteListener ( this, task -> {
if (task.isSuccessful ()) {
String uid = firebaseAuth.getCurrentUser ().getUid ();
Map<String, String> userDetails = new HashMap<> ();
userDetails.put ( "username", "test@gmail.com" );
DatabaseReference usersInfo = FirebaseDatabase.getInstance ().getReference ( "users" );
usersInfo.child ( uid ).setValue ( userDetails ).addOnCompleteListener ( task1 -> {
Log.d ( "INFORMATION", "Added" );
setResult ( RESULT_OK );
finish ();
} );
} else {
Log.d ( "INFORMATION", "Error" );
}
} );
}
}
希望以上解决方案对您有所帮助!
推荐阅读
- reactjs - 无法从“node_modules\expo\AppEntry.js”解析“../../App”
- python - 'scrapy: command not found' 即使要求已经满足
- reactjs - 什么是浏览代码库和查找网页源代码的好方法
- lua - 使用“tonumber”后如何将数字再次转换为十六进制?
- mysql - 如何编写通用 SQL 查询以 (YYYY-MM-DD) 形式提取与所有 RDBMS(Oracle、SQL 服务器、MySql、DB2 等等)兼容的日期
- react-native - 最初无法在抽屉导航器中传递道具
- javascript - lodash find 只返回一个结果
- ios - 如何在 Text() 内部的 SwiftUI 中使用 swift-currency 显示货币而不显示“可选”?
- firebase - 云功能的处理 Firebase 实时数据库
- javascript - 如果应用程序中使用的所有函数都以 `async` 为前缀,无论它是否真的是异步的,会发生什么?