【问题标题】:Saving and Editing Date in Firebase在 Firebase 中保存和编辑日期
【发布时间】:2021-08-26 09:03:23
【问题描述】:

第一次发布任务,我是一名学生,我的代码有问题。我的应用程序可以将“日期”保存到我的 Firestore 数据库,但是当我编辑它时,文本视图无法检索我的 Firestore 数据库中的日期数据。如何检索 DATE 数据以便进行编辑。

这是我正在编辑的代码

public class EditProfile extends AppCompatActivity {

public static final String TAG = "TAG";
EditText profileFullName,profileEmail,profilePhone,profileAddre,profileBday;
ImageView profileImageView;
Button saveBtn;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
FirebaseUser user;
StorageReference storageReference;

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

    Intent data = getIntent();
    final String fullName = data.getStringExtra("fullName");
    String email = data.getStringExtra("email");
    String phone = data.getStringExtra("phone");
    String addre = data.getStringExtra("addre");
    String singup_bday = data.getStringExtra("singup_bday");

    fAuth = FirebaseAuth.getInstance();
    fStore = FirebaseFirestore.getInstance();
    user = fAuth.getCurrentUser();
    storageReference = FirebaseStorage.getInstance().getReference();

    profileFullName = findViewById(R.id.profileFullName);
    profileEmail = findViewById(R.id.profileEmailAddress);
    profilePhone = findViewById(R.id.profilePhoneNo);
    profileAddre = findViewById(R.id.profileEditAddress);
    profileImageView = findViewById(R.id.profileImageView);
    profileBday = findViewById(R.id.profileEditBday);

    saveBtn = findViewById(R.id.saveProfileInfo);

    StorageReference profileRef = storageReference.child("users/"+fAuth.getCurrentUser().getUid()+"/profile.jpg");
    profileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            Picasso.get().load(uri).into(profileImageView);
        }
    });
    
    profileImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent openGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(openGalleryIntent,1000);
        }
    });
    
    saveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(profileBday.getText().toString().isEmpty() || profileAddre.getText().toString().isEmpty() || profileFullName.getText().toString().isEmpty() || profileEmail.getText().toString().isEmpty() || profilePhone.getText().toString().isEmpty()){
                Toast.makeText(EditProfile.this, "One or Many fields are empty.", Toast.LENGTH_SHORT).show();
                return;
            }

            final String email = profileEmail.getText().toString();
            user.updateEmail(email).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    DocumentReference docRef = fStore.collection("users").document(user.getUid());
                    Map<String,Object> edited = new HashMap<>();
                    edited.put("email",email);
                    edited.put("fName",profileFullName.getText().toString());
                    edited.put("phone",profilePhone.getText().toString());
                    edited.put("addre",profileAddre.getText().toString());
                    edited.put("singup_bday",profileBday.getText().toString());
                    docRef.update(edited).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(EditProfile.this, "Profile Updated", Toast.LENGTH_SHORT).show();
                            startActivity(new Intent(getApplicationContext(),MainActivity.class));
                            finish();
                        }
                    });
                    Toast.makeText(EditProfile.this, "Email is changed.", Toast.LENGTH_SHORT).show();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(EditProfile.this,   e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });


        }
    });

    profileEmail.setText(email);
    profileFullName.setText(fullName);
    profilePhone.setText(phone);
    profileAddre.setText(addre);
    profileBday.setText(singup_bday);
    Log.d(TAG, "onCreate: " + fullName + " " + email + " " + phone + " " + addre + " " + singup_bday);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @androidx.annotation.Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1000){
        if(resultCode == Activity.RESULT_OK){
            Uri imageUri = data.getData();

            //profileImage.setImageURI(imageUri);

            uploadImageToFirebase(imageUri);


        }
    }

}

private void uploadImageToFirebase(Uri imageUri) {
    // upload image to firebase storage
    final StorageReference fileRef = storageReference.child("users/"+fAuth.getCurrentUser().getUid()+"/profile.jpg");
    fileRef.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    Picasso.get().load(uri).into(profileImageView);
                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(getApplicationContext(), "Failed.", Toast.LENGTH_SHORT).show();
        }
    });

}

这是我的保存代码

public class Register extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{
private TextView dateText;
public static final String TAG = "TAG";

EditText mFullName,mEmail,mPassword,mPhone,mAddress,mBday;
Button mRegisterBtn;
TextView mLoginBtn;
FirebaseAuth fAuth;
ProgressBar progressBar;
FirebaseFirestore fStore;
String userID;

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

    mFullName   = findViewById(R.id.fullName);
    mEmail      = findViewById(R.id.Email);
    mPassword   = findViewById(R.id.password);
    mPhone      = findViewById(R.id.phone);
    mAddress    = findViewById(R.id.addre);
    mBday    = findViewById(R.id.singup_bday);

    mRegisterBtn= findViewById(R.id.registerBtn);
    mLoginBtn   = findViewById(R.id.createText);

    fAuth = FirebaseAuth.getInstance();
    fStore = FirebaseFirestore.getInstance();
    progressBar = findViewById(R.id.progressBar);

    dateText = findViewById(R.id.singup_bday);

    findViewById(R.id.singup_bday).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDatePickerDialog();
        }
    });

    if(fAuth.getCurrentUser() != null){
        startActivity(new Intent(getApplicationContext(),MainActivity.class));
        finish();
    }


    mRegisterBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String email = mEmail.getText().toString().trim();
            String password = mPassword.getText().toString().trim();
            final String fullName = mFullName.getText().toString();
            final String phone    = mPhone.getText().toString();
            final String addre   = mAddress.getText().toString();
            final String signup_bday   = mBday.getText().toString();

            if(TextUtils.isEmpty(email)){
                mEmail.setError("Email is Required.");
                return;
            }

            if(TextUtils.isEmpty(password)){
                mPassword.setError("Password is Required.");
                return;
            }

            if(password.length() < 6){
                mPassword.setError("Password Must be >= 6 Characters");
                return;
            }

            if(TextUtils.isEmpty(addre)){
                mAddress.setError("Address is Required.");
                return;
            }

            if(TextUtils.isEmpty(signup_bday)){
                mBday.setError("Birthday is Required.");
                return;
            }

            progressBar.setVisibility(View.VISIBLE);

            // register the user in firebase

            fAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){

                        // send verification link

                        FirebaseUser fuser = fAuth.getCurrentUser();
                        fuser.sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(Register.this, "Verification Email Has been Sent.", Toast.LENGTH_SHORT).show();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.d(TAG, "onFailure: Email not sent " + e.getMessage());
                            }
                        });

                        Toast.makeText(Register.this, "User Created.", Toast.LENGTH_SHORT).show();
                        userID = fAuth.getCurrentUser().getUid();
                        DocumentReference documentReference = fStore.collection("users").document(userID);
                        Map<String,Object> user = new HashMap<>();
                        user.put("fName",fullName);
                        user.put("email",email);
                        user.put("phone",phone);
                        user.put("addre",addre);
                        user.put("bday",signup_bday);
                        documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d(TAG, "onSuccess: user Profile is created for "+ userID);
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.d(TAG, "onFailure: " + e.toString());
                            }
                        });
                        startActivity(new Intent(getApplicationContext(),MainActivity.class));

                    }else {
                        Toast.makeText(Register.this, "Error ! " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        progressBar.setVisibility(View.GONE);
                    }
                }
            });
        }
    });



    mLoginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(getApplicationContext(),Login.class));
        }
    });

}`

【问题讨论】:

  • 如果您遇到问题,最好在发布问题时创建MCVE。您为此问题发布了近 300(三百)行行代码。人们需要解析和尝试在线调试的内容很多。请编辑您的问题并隔离问题,这样可以增加获得帮助的机会。
  • 除此之外,这段代码中究竟有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
  • @AlexMamo imgur.com/M6kAH7C 你能检查一下链接吗?对不起,我不能正确地说和理解英语

标签: java android firebase google-cloud-firestore


【解决方案1】:

当您将日期对象存储到 Firestore 时,它​​会转换为精确到纳秒的版本。您可以使用将其转换回普通时间戳 const dateObject = myFirestoreTimestamp.ToDateTime()

当你转换回来时,你可以在更新数据时直接将它传递给firestore

或者,你可以使用

newTime = firebase.firestore.Timestamp(dateObject)

您可以在reference guide 中了解更多信息。

【讨论】:

  • 先生,我应该把代码放在哪里?我应该把这些改成什么? final String signup_bday = mBday.getText().toString(); edited.put("singup_bday",profileBday.getText().toString()); profileBday.setText(singup_bday);
  • 当您需要将时间戳保存到数据库时,您最不想做的就是将其保存为字符串,将其保存为日期对象可以让您更好地操作和查询它
  • 您好先生,您可以编辑我的代码吗?我应该改变什么?
猜你喜欢
  • 2016-10-24
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多