【问题标题】:How can I fix this code to make collection for each user?如何修复此代码以为每个用户进行收集?
【发布时间】:2020-10-29 16:57:27
【问题描述】:

我正在为我的学习制作一个 Android 应用程序。这是关于婴儿作为新父母的一般帮助。我有一个登录和注册,带有 recyclerview 的婴儿列表和应用程序的其他部分。我制作了一个集合,但每个新用户都可以看到相同的集合。如何更改我的代码为他们创建一个新集合,以防止看到您不拥有的婴儿?下面的代码是带有 recyclerview 的婴儿列表,您可以在其中选择婴儿进入下一个屏幕。该集合只在这里,也许我应该在登录活动的某个地方创建它,但我不知道如何编辑它。我正在看教程,但它并没有真正帮助。

package com.example.babycare.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.babycare.model.Child;
import com.example.babycare.adapter.ChildAadpter;
import com.example.babycare.R;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;

public class babyList extends AppCompatActivity {

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference childbookRef = db.collection("Children");

    private ChildAadpter adapter;

    private TextView nameView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_baby_list);

        FloatingActionButton buttonAddChild = findViewById(R.id.button_add_child);
        buttonAddChild.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(babyList.this, NewChildActivity.class));
            }
        });

        /*  FloatingActionButton buttonHelp = findViewById(R.id.button_help);
            buttonHelp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(babyList.this, HelpActivity.class));
            }
        }); */

        setUpRecyclerView();
    }

    private void setUpRecyclerView() {
        Query query = childbookRef.orderBy("age", Query.Direction.DESCENDING);

        FirestoreRecyclerOptions<Child> options = new FirestoreRecyclerOptions.Builder<Child>()
                .setQuery(query, Child.class)
                .build();

        adapter = new ChildAadpter(options);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                adapter.deleteChild(viewHolder.getAdapterPosition());
            }
        }).attachToRecyclerView(recyclerView);

        adapter.setOnItemClickListener(new ChildAadpter.OnItemClickListener() {
            @Override
            public void onItemClick(DocumentSnapshot documentSnapshot, int position) {

                nameView = findViewById(R.id.timeSlept);
                Intent intent = new Intent(babyList.this, SelectionMenu.class);
                startActivity(intent);
                Toast.makeText(babyList.this, "Child " + position, Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

和登录活动

package com.example.babycare.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.babycare.R;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;


public class LoginActivity extends AppCompatActivity {

    public EditText loginEmailId, logInPassword;
    Button buttonLogIn;
    FirebaseAuth firebaseAuth;
    private FirebaseAuth.AuthStateListener authStateListener;
    private TextView forgotPassword;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        forgotPassword = (TextView) findViewById(R.id.forgotPassword);

        forgotPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity( new Intent(LoginActivity.this, ForgotPassword.class));
            }
        });


        TextView buttonSignIn = findViewById(R.id.buttonSignIn);
        buttonSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
            }
        });

        firebaseAuth = FirebaseAuth.getInstance();
        loginEmailId = findViewById(R.id.inputEmail);
        logInPassword = findViewById(R.id.inputPassword);
        buttonLogIn = findViewById(R.id.buttonLogin);
        authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    Toast.makeText(LoginActivity.this, "User logged in ", Toast.LENGTH_SHORT).show();
                    Intent I = new Intent(LoginActivity.this, WelcomeActivity.class);
                    startActivity(I);
                }else {
                    Toast.makeText(LoginActivity.this, "Login to continue", Toast.LENGTH_SHORT).show();
                }
            }
        };

        buttonLogIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String userEmail = loginEmailId.getText().toString();
                String userPassword = logInPassword.getText().toString();
                if (userEmail.isEmpty()) {
                    loginEmailId.setError("Provide your Email first!");
                    loginEmailId.requestFocus();
                }else if (userPassword.isEmpty()) {
                    logInPassword.setError("Enter Password!");
                    logInPassword.requestFocus();
                }else if (userEmail.isEmpty() && userPassword.isEmpty()) {
                    Toast.makeText(LoginActivity.this, "Fields empty!", Toast.LENGTH_SHORT).show();
                }else if (! (userEmail.isEmpty() && userPassword.isEmpty())) {
                    firebaseAuth.signInWithEmailAndPassword(userEmail, userPassword).addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (!task.isSuccessful()) {
                                Toast.makeText(LoginActivity.this, "Not sucessfull", Toast.LENGTH_SHORT).show();
                            }else {
                                startActivity(new Intent(LoginActivity.this, WelcomeActivity.class));
                            }
                        }
                    });
                }else {
                    Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    @Override
    protected void onStart() {
        super.onStart();
        firebaseAuth.addAuthStateListener(authStateListener);
    }
}

注册活动

package com.example.babycare.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.babycare.R;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;

public class RegisterActivity extends AppCompatActivity {

    public EditText emailId, password, password2;
    Button buttonRegistration;
    FirebaseAuth firebaseAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        TextView buttonAlreadyHaveAnAccount = findViewById(R.id.alreadyHaveAccount);
        buttonAlreadyHaveAnAccount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
            }
        });


        firebaseAuth = FirebaseAuth.getInstance();
        emailId = findViewById(R.id.inputEmail);
        password = findViewById(R.id.inputPassword);
        password2 = findViewById(R.id.inputConfirmPassword);
        buttonRegistration = findViewById(R.id.buttonRegister);
        buttonRegistration.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputEmail = emailId.getText().toString();
                String inputPassword = password.getText().toString();
                String inputPasswordConfirm = password2.getText().toString();
                if (inputEmail.isEmpty()) {
                    emailId.setError("Provide your Email first!");
                    emailId.requestFocus();
                } else if (inputPassword.isEmpty()) {
                    password.setError("Set your password");
                    password.requestFocus();
                }else if (inputPasswordConfirm.isEmpty()) {
                    password2.setError("Confirm your password");
                    password2.requestFocus();
                }else if(inputEmail.isEmpty() && inputPassword.isEmpty()) {
                    Toast.makeText(RegisterActivity.this, "Fields Empty!", Toast.LENGTH_SHORT).show();
                }else if (! (inputEmail.isEmpty() && inputPassword.isEmpty() && inputPasswordConfirm.isEmpty())) {
                    firebaseAuth.createUserWithEmailAndPassword(inputEmail, inputPassword).addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {

                            if(!task.isSuccessful()) {
                                Toast.makeText(RegisterActivity.this.getApplicationContext(), "SignUp unsuccessful: "+ task.getException().getMessage(),Toast.LENGTH_SHORT).show();
                            }else {
                                startActivity(new Intent(RegisterActivity.this, WelcomeActivity.class));
                            }
                        }
                    });
                }else {
                    Toast.makeText(RegisterActivity.this, "Error", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

【问题讨论】:

    标签: java android-recyclerview google-cloud-firestore


    【解决方案1】:

    如果您还没有标识符,请在您的登录名中添加一个标识符。将父母的标识符添加到他拥有的每个婴儿中。在获取婴儿数据时,会将父母的标识符传递给查询,因此只有属于父母/登录标识符的婴儿才会出现在结果中。

    标识符可以是唯一的数值,但您也可以使用用于登录的唯一数据,即电子邮件、令牌或类似信息。

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2019-10-06
      相关资源
      最近更新 更多