【问题标题】:setValue() not working in firebase realtime databasesetValue()在firebase实时数据库中不起作用
【发布时间】:2019-10-14 00:40:48
【问题描述】:

我正在尝试在 firebase 实时数据库中创建新数据 我尝试使用 HashMap 和一个对象,但它们都不起作用。 即使我放置了 OnComplete/OnSuccess/OnFailure 侦听器,我也没有在日志中收到任何数据。

private void registerUser(final String displayName, String email, String password) {
        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            FirebaseUser currentUser = mAuth.getCurrentUser();
                            String uid = currentUser.getUid();
                            HashMap<String, String> userMap = new HashMap<>();
                            User user = new User(displayName, "Bonjour!", "par defaut", "def");
                            userMap.put("name", displayName);
                            userMap.put("status", "Bonjour!_Je_viens_de_m'inscirire");
                            userMap.put("image", "par_defaut");
                            userMap.put("thumb_image", "def");
                            Log.d(TAG, "onComplete: " + userMap);
                            Log.d(TAG, "onComplete: " + user);
                            mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users").child(uid);
                            mDatabaseReference.setValue(user)
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void aVoid) {
                                            Log.d(TAG, "onSuccess: ");
                                        }
                                    })
                                    .addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            Log.d(TAG, "onFailure: " + e.getMessage());
                                        }
                                    });
                            Log.d(TAG, "onComplete: " + mDatabaseReference);
mRegProgressBar.setVisibility(View.GONE);
                            Intent maintIntent = new Intent(RegisterActivity.this, MainActivity.class);
                            maintIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                            startActivity(maintIntent);
                            finish();

                        } else {
                            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                            mRegProgressBar.setVisibility(View.GONE);
                            Toast.makeText(RegisterActivity.this, "impossible d'inscrire, veuillez ressayer!", Toast.LENGTH_LONG).show();
                        }

我尝试添加此代码,它在日志中显示:“未连接”。

//check if connected
                            DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
                            connectedRef.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot snapshot) {
                                    boolean connected = snapshot.getValue(Boolean.class);
                                    if (connected) {
                                        Log.d(TAG, "connected");
                                    } else {
                                        Log.d(TAG, "not connected");
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError error) {
                                    Log.w(TAG, "Listener was cancelled");
                                }
                            });

HashMap 包含实际数据,但 setValue() 方法由于某种原因不起作用。当我查看 firebase 控制台时,没有任何变化。

【问题讨论】:

  • 只有在服务器上写入/拒绝数据后才会触发完成侦听器。您的设备是否连接到互联网/Firebase 服务器?
  • 如果!task.isSuccessful() 会发生什么?我们看不到您的代码。 logcat 说什么?
  • 是的,它已连接到互联网并且可以在分析中检测到。对于不成功的部分,我有这个:```} else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); mRegProgressBar.setVisibility(View.GONE); Toast.makeText(RegisterActivity.this, "不可能的 d'inscrire, veuillez ressayer!", Toast.LENGTH_LONG).show(); } ```

标签: android firebase-realtime-database


【解决方案1】:

负责将活动从 RegisterActivity 更改为 MainActivity 的代码在实际能够将数据发送到数据库之前运行。 为了解决这个问题,我只是将负责更改活动的代码部分以及所有这些:

mRegProgressBar.setVisibility(View.GONE);
                            Intent maintIntent = new Intent(RegisterActivity.this, MainActivity.class);
                            maintIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                            startActivity(maintIntent);
                            finish();

在 OnSuccessListener 内部。 所以最终的代码是:

private void registerUser(final String displayName, String email, String password) {
        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            FirebaseUser currentUser = mAuth.getCurrentUser();
                            String uid = currentUser.getUid();
                            HashMap<String, String> userMap = new HashMap<>();
                            userMap.put("name", displayName);
                            userMap.put("status", "Bonjour!_Je_viens_de_m'inscirire");
                            userMap.put("image", "par_defaut");
                            userMap.put("thumb_image", "def");
                            mDatabaseReference = mDatabase.getReference("Users").child(uid);
                            mDatabaseReference.setValue(userMap)
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void aVoid) {
                                            Log.d(TAG, "onSuccess: ");
                                            mRegProgressBar.setVisibility(View.GONE);
                                            Intent maintIntent = new Intent(RegisterActivity.this, MainActivity.class);
                                            maintIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                            startActivity(maintIntent);
                                            finish();
                                        }
                                    })
                                    .addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            Log.d(TAG, "onFailure: " + e.getMessage());
                                        }
                                    });
                        } else {
                            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                            mRegProgressBar.setVisibility(View.GONE);
                            Toast.makeText(RegisterActivity.this, "impossible d'inscrire, veuillez ressayer!", Toast.LENGTH_LONG).show();
                        }
                    }
                });

感谢评论者。

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2021-03-23
    • 2020-04-11
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多