首页 > 解决方案 > 无法将数据上传到实时 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'}

标签: javaandroidfirebasefirebase-realtime-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" );
                    }
                } );
    }
}

希望以上解决方案对您有所帮助!


推荐阅读