【问题标题】:Unable to save Authenticated User data into Firebase无法将经过身份验证的用户数据保存到 Firebase
【发布时间】:2018-10-17 11:00:02
【问题描述】:

我想在 Firebase 中保存经过身份验证的用户的数据,有两种方法可以在我的应用中验证数据,然后将用户带到 MainActivity.Java。我想看看用户是否是第一次使用该应用程序,如果是,请将详细信息添加到 Firebase RealtimeDatabase 中的用户树中。

截至目前,在添加用户注释下方的 OnCreate 中添加代码后,应用程序没有崩溃或出现任何错误,但也没有命中 Firebase 数据库并更新它。

这是我在MainActivity.Java 的 OnCreate 部分的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Carousel

        customCarouselView = findViewById(R.id.customCarouselView);

        customCarouselView.setPageCount(sampleImages.length);
        customCarouselView.setSlideInterval(4000);


        customCarouselView.setImageListener(imageListener);

        customCarouselView.setImageClickListener(new ImageClickListener() {
            @Override
            public void onClick(int position) {
//                Toast.makeText(MainActivity.this, "Clicked item: " + position, Toast.LENGTH_SHORT).show();
                redirectToHotDeals();
            }
        });

        // -- Carousel


        FirebaseAuth.getInstance().getCurrentUser();


        if (FirebaseAuth.getInstance().getCurrentUser() != null) {
            // User is signed in.
            String name = FirebaseAuth.getInstance().getCurrentUser().getDisplayName();
            String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
            String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

            NavigationView navigationView = findViewById(R.id.nav_view);
            View headerView = navigationView.getHeaderView(0);
            TextView navUsername = headerView.findViewById(R.id.emailText);
            TextView navUID = headerView.findViewById(R.id.uid);
            navUID.setText("ID: " + uid.substring(0, 10));
            navUsername.setText(email);


        } else {
            // No user is signed in.
            redirectToLogin();
        }

        // Action Bar

        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("Coupons List");

        mRecyclerView = findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);

        // Set Layout
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        // Send Query to Firebase Db
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mRef = mFirebaseDatabase.getReference("Data");

        // Add User to DB or Update it
        String name = FirebaseAuth.getInstance().getCurrentUser().getDisplayName();
        String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        FirebaseUser fUser = FirebaseAuth.getInstance().getCurrentUser();
        User user = new User(name, email);
        mRef.child("User").child(fUser.getUid()).setValue(user);


        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

这是 Firebase 数据库的图像:我希望第一个孩子有 UID,后跟电子邮件和联系人作为其孩子。

这是我的User.Java

public class User {
    public String name, email, phone;

    public User(String name, String email){

    }

    public User(String name, String email, String phone) {
        this.name = name;
        this.email = email;
        this.phone = phone;
    }
}

【问题讨论】:

  • 您使用哪种注册方式?电子邮件/密码或电话?
  • 电子邮件和谷歌
  • 您是否还要添加firebase数据库的根结构? User 似乎不是 Data 孩子。
  • @Mohsen 我附上了上面的图片。数据库分为三个根结构(数据、目录和用户)。
  • @PradyumanDixit 不幸的是没有。我最终通过 Firebase Docs 解决了这个问题。

标签: android firebase firebase-realtime-database


【解决方案1】:

您可以使用这段代码来更新数据库中的值:

AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(),null);
        mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if(task.isSuccessful()){
                    Log.d("Tag","SignInWithCredential: success");

                    FirebaseUser fUser = mAuth.getCurrentUser();
                    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
                    assert fUser != null;
                    User user = new User(fUser.getDisplayName(),fUser.getUid());
                    ref.child("users").child(fUser.getUid()).setValue(user);

                }
                else{
                    Log.w("TAG","SignInWithCredential: failure", task.getException());
                    Toast.makeText(MainActivity.this,"Authentication failed", Toast.LENGTH_SHORT).show();

                }
            }
        });

【讨论】:

    【解决方案2】:

    NavigationView 首先声明重复。在onCreate() 中定义如下:

    navigationView = findViewById(R.id.nav_view);
    

    然后;

    NavigationView navigationView;
    @Override
     protected void onCreate(Bundle savedInstanceState) {
     ...
    

    关于 Firebase 数据集,User 节点似乎不是您这样声明的 Data 的子节点:

    mRef = mFirebaseDatabase.getReference("Data");
    mRef.child("User").child(fUser.getUid()).setValue(user);
    

    试试这个:

    mRef = mFirebaseDatabase.getReference("User");
    mRef.child("UID").setValue(user);
    

    请注意,我们需要确保 User 节点是此处的引用。似乎还有另一个根引用,我们需要检查整个结构,但我只是为您提供了如何获取和设置数据的路径。

    但是,正如 documentation 所说,您需要 authenticated-Logged-in 才能使用 Firebase 数据库 update-remove 等。否则,你应该改变你的规则,让每个人都可以进行编辑等。

    【讨论】:

    • 现在规则是开放的,读和写都是真的。 Data 的子级的 mRef 也用于绑定回收站视图。我将无法删除它并添加这个。
    • 您实际上是在让自己变得复杂。例如,创建一个FirebaseAuth.getInstance().getCurrentUser() 的对象,然后以object.getDisplayName() 为例,在您的应用程序中使用它。关于 RecyclerView 数据,如果您无法更改它,您应该创建另一个查询,如我的答案中更新 UID。然后,考虑阅读有关安全规则等的文档。
    猜你喜欢
    • 2019-09-27
    • 2018-08-18
    • 2017-12-27
    • 2019-10-01
    • 1970-01-01
    • 2022-11-25
    • 2015-04-02
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多