当我try 在Firebase实时数据库中存储数据时,所有其他对象都会被存储,除了一个对象,即, postsMap.put("postimage", downloadUrl);,此特定数据不会存储在Firebase实时数据库中,其余所有其他数据都会被存储.

这是我的PostActivity.java代码-

public class PostActivity extends AppCompatActivity {
    
     private Toolbar mToolbar;
     
     private ProgressDialog loadingBar;
     private ImageButton SelectPostImage;
     private Button UpdatePostButton;
     
     private EditText PostDescription;
    
     private static final int Gallery_Pick = 1;
     
     private Uri ImageUri;
    
     private String Description;
     
     private StorageReference PostsImagesReference;
     
     private DatabaseReference UsersRef, PostsRef;
     
     private FirebaseAuth mAuth;
     
     private String saveCurrentDate, saveCurrentTime, postRandomName,downloadUrl, current_user_id;
     
     
         @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
     
      setContentView(R.layout.activity_post);
    
      mAuth = FirebaseAuth.getInstance();
      current_user_id = mAuth.getCurrentUser().getUid();
     
      PostsImagesReference = FirebaseStorage.getInstance().getReference();
      UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
      PostsRef = FirebaseDatabase.getInstance().getReference().child("Posts");
     
      SelectPostImage = findViewById(R.id.select_post_image);
      UpdatePostButton = findViewById(R.id.update_post_button);
      PostDescription = findViewById(R.id.post_description);
      loadingBar = new ProgressDialog(this);
    
      mToolbar = findViewById(R.id.update_post_page_toolbar);
      setSupportActionBar(mToolbar);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      getSupportActionBar().setDisplayShowHomeEnabled(true);
      getSupportActionBar().setTitle("Update Post");
    
    
    
     SelectPostImage.setOnClickListener(new View.OnClickListener() {
               @Override
     public void onClick(View v) {
     
     OpenGallery();
     }
            });
     UpdatePostButton.setOnClickListener(new View.OnClickListener() {
                 @Override
     public void onClick(View v) {
     
     ValidatePostInfo();
     
                 }
            });
    
    
         }
    
     private void ValidatePostInfo() {
     
     Description = PostDescription.getText().toString();
     
     if(ImageUri == null)
            {
     Toast.makeText(this,"Please select post image",Toast.LENGTH_LONG).show();
     else if (TextUtils.isEmpty(Description)) {
     
     Toast.makeText(this,"Please say something about your image",Toast.LENGTH_LONG).show();
    
            }
     else
             {
     loadingBar.setTitle("Add New Post");
     loadingBar.setMessage("Please wait, while we are creating your new post....");
     loadingBar.show();
     loadingBar.setCanceledOnTouchOutside(true);
     StoringImageToFirebaseStorage();
             }
    
         }
     
     private void StoringImageToFirebaseStorage() {
     
     
     Calendar callForDate = Calendar.getInstance();
     SimpleDateFormat currentDate = new SimpleDateFormat("dd-MMMM-yyyy");
     saveCurrentDate = currentDate.format(callForDate.getTime());
     
     
     Calendar callForTime = Calendar.getInstance();
     SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm");
     saveCurrentTime = currentTime.format(callForDate.getTime());
     
     postRandomName = saveCurrentDate + saveCurrentTime;
     
     
     StorageReference filePath = PostsImagesReference.child("Post Images").child(ImageUri.getLastPathSegment() + postRandomName + ".jpg");
    
     filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                @Override
     public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
    
     if(task.isSuccessful())
                                     {
     filePath.putFile(ImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                            @Override
     public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
     filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                                     @Override
     public void onSuccess(Uri uri) {
     downloadUrl =  uri.toString();
    
                                                     }
                                                 });
                                            }
                                        });
    
    
     Toast.makeText(PostActivity.this,"Image uploaded successfully to storage", Toast.LENGTH_LONG).show();
     
     SavingPostInformationToDatabase();
                                     }
     else
                                    {
     String message = task.getException().getMessage();
     Toast.makeText(PostActivity.this,"Error Occured: " + message, Toast.LENGTH_LONG).show();
                                     }
                                 }
                             });
         }
     private void SavingPostInformationToDatabase() {
     
     UsersRef.child(current_user_id).addValueEventListener(new ValueEventListener() {
                 @Override
     public void onDataChange(@NonNull DataSnapshot snapshot) {
    
     if(snapshot.exists())
                     {
     String userFullName = snapshot.child("fullname").getValue().toString();
     String userProfileImage = snapshot.child("profileimage").getValue().toString();
     
     HashMap postsMap = new HashMap();
     postsMap.put("uid", current_user_id);
     postsMap.put("date", saveCurrentDate);
     postsMap.put("time", saveCurrentTime);
     postsMap.put("description", Description);
     postsMap.put("postimage", downloadUrl);
     postsMap.put("profileimage",userProfileImage);
     postsMap.put("fullname", userFullName);
    
     PostsRef.child(current_user_id + postRandomName).updateChildren(postsMap).addOnCompleteListener(new OnCompleteListener() {
                             @Override
     public void onComplete(@NonNull Task task) {
     
     if(task.isSuccessful())
                                 {
     SendUserToMainActivity();
     Toast.makeText(PostActivity.this,"New Post is created 
     successfully.",Toast.LENGTH_LONG).show();
     loadingBar.dismiss();
                                 }
     else
                                {
     Toast.makeText(PostActivity.this,"Error occured while creating your post",Toast.LENGTH_LONG).show();
     loadingBar.dismiss();
                                 }
    
                             }
                         });
    
    
    
     
                     }
    
                 }
                 @Override
     public void onCancelled(@NonNull DatabaseError error) {
    
                 }
             });
    
         }
     
      private void OpenGallery() {
     
     Intent galleryIntent = new Intent();
     galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
     galleryIntent.setType("image/*");
     startActivityForResult(galleryIntent,Gallery_Pick);
     
     
         }
    
         @Override
     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    
     
     super.onActivityResult(requestCode, resultCode, data);
     
     if(requestCode == Gallery_Pick && resultCode == RESULT_OK && data!=null)
             {
     ImageUri = data.getData();
     SelectPostImage.setImageURI(ImageUri);
            }
        }
    
         @Override
     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
     
     int id = item.getItemId();
     
     if(id == androidx.appcompat.R.id.home)
             {
     SendUserToMainActivity();
     
             }
     
     return super.onOptionsItemSelected(item);
         }
     
         @Override
     public boolean onSupportNavigateUp() {
     getOnBackPressedDispatcher().onBackPressed();
     return super.onSupportNavigateUp();
         }
     
     private void SendUserToMainActivity() {
     
     Intent mainIntent = new Intent(PostActivity.this, MainActivity.class);
     startActivity(mainIntent);
     
     }
 }

这是我的Firebase数据库的图像,所有其他对象都在被存储,但只有 postsMap.put("postimage", downloadUrl);个对象没有被存储.

这是我的html代码-

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/main"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/login_register"
 tools:context=".PostActivity">
 
 
     <include
 android:id="@+id/update_post_page_toolbar"
 layout="@layout/app_bar_layout"
 
 
         />

    <ImageButton
 android:id="@+id/select_post_image"
 android:layout_width="match_parent"
 android:layout_height="300dp"
 android:layout_below="@id/update_post_page_toolbar"
 android:layout_alignParentStart="true"
 android:layout_margin="20dp"
 android:layout_marginTop="30dp"
 android:scaleType="fitCenter"
 app:srcCompat="@drawable/select_image" />

     <EditText
 android:id="@+id/post_description"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@id/select_post_image"
 android:layout_centerHorizontal="true"
 android:layout_margin="10dp"
 android:background="@drawable/inputs"
 android:ems="10"
 android:gravity="start|top"
 android:hint="write something about your image here"
 android:inputType="textMultiLine"
 android:padding="15dp"
         />
 
    <Button
 android:id="@+id/update_post_button"
 android:layout_width="200dp"
 android:layout_height="wrap_content"
 android:layout_below="@id/post_description"
 android:layout_centerHorizontal="true"
 android:layout_margin="70dp"
 android:background="@drawable/button"
 android:padding="10dp"
 android:text="Create Post"
 android:textColor="@android:color/background_light"
 android:textSize="18sp" />
 
 
 </RelativeLayout>

以下是我的Gradle依赖项-

 dependencies {
 implementation(platform("com.google.firebase:firebase-bom:32.8.0"))
 implementation("com.google.firebase:firebase-database")
 implementation libs.appcompat
 implementation libs.material
 implementation libs.activity
 implementation libs.constraintlayout
 implementation libs.firebase.auth
 implementation libs.design
 testImplementation libs.junit
 androidTestImplementation libs.ext.junit
 androidTestImplementation libs.espresso.core
 
 
 implementation 'com.android.support:design:28.0.0'
 
 implementation 'de.hdodenhof:circleimageview:3.1.0'
 
 api 'com.theartofdev.edmodo:android-image-cropper:2.8.+'
 
 implementation 'com.squareup.picasso:picasso:2.5.2'
 
 implementation 'com.github.bumptech.glide:glide:4.16.0'
 
 }
 
 

帖子图像将存储在Firebase存储中.

我认为这段代码有问题,但我想不出到底是什么问题,所以请帮忙.

 StorageReference filePath = PostsImagesReference.child("Post Images").child(ImageUri.getLastPathSegment() + postRandomName + ".jpg");

 

 
 filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                            @Override
 public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
 
 
 if(task.isSuccessful())
                                {
 filePath.putFile(ImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                         @Override
 public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
 filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                                 @Override
 public void onSuccess(Uri uri) {
 downloadUrl =  uri.toString();

                                                }
                                             });
                                         }
                                    });

 Toast.makeText(PostActivity.this,"Image uploaded successfully to storage", Toast.LENGTH_LONG).show();
 
 SavingPostInformationToDatabase();
 
                                 }
 else
                                 {
 String message = task.getException().getMessage();
 Toast.makeText(PostActivity.this,"Error Occured: " + message, Toast.LENGTH_LONG).show();
                                }
                            }
                        });


     }

推荐答案

所有其他对象都将被存储,除了一个对象,即, postsMap.put("postimage", downloadUrl);.此特定数据不会存储在Firebase实时数据库中.

发生这种情况是因为downloadUrl的值为空.与Firestore中的null is a supported data type不同,在实时数据库中,您无法存储null个值.一旦字段的值变成null,该 node 就不再存在.因此,如果您在Firebase控制台中查找值为null的字段,则不会找到它.

为什么downloadUrl是空的?这是因为当您创建postsMap并添加downloadUrl时,值是null,因为在存储中添加文件的操作是同步的.因此,您应该等到上传文件的操作成功,然后立即执行任何其他需要值downloadUrl的操作.

所以解决方案总是一样的.任何需要使用作为同步操作响应的数据的代码都需要位于onSuccess方法内部或从那里调用.

因此,如果您需要将数据添加到Firebase实时数据库,请在onSuccess方法中执行,您onSuccess%确定会生成downloadUrl,并且可以使用它将完整的数据添加到数据库.

Android相关问答推荐

无法列出目录中的文件'

如何检测HitTest是否命中给定的网格对象?

合成-删除图像的部分背景

添加可组合元素的列表?

如何使用Jetpack Compose实现此底表?

Play Google上发布的一款应用的房间数据库迁移

学习Kotlin问题.无法理解Modifier参数

Android 构建失败:找不到 flexbox2.0.1.aar

Android WebView 不会在滚动端加载新内容

为一组闪烁的可组合项制作动画,控制同步/定时

如何在 Jetpack Compose 中对齐按钮底部中心?

在 AGP 8.0 中构建失败,无法应用插件realm-android. APIandroid.registerTransform已删除

Android Studio XML 文本在 ConstraintLayout 中不居中

如何用jetpack compose实现垂直李克特量表

如何在jetpack compose中创建自定义rememberState?

Google Play 控制台您的应用是否使用广告 ID?

将生成的 AAR 与 Composables 一起使用时未解决的参考

react-native android项目未找到错误

单个用户可以在 Firebase 身份验证中将多个电话号码链接到他的帐户吗?

Android Jetpack Compose:如何让文本利用完整的行空间并将单词换行以防溢出?