2017-04-10 45 views
0

我的Firebase存儲和實時數據庫存在問題。我的firebase對象由4個字符串字段組成,其中三個來自EditText窗口小部件,第四個字段必須是放入Firebase存儲的圖像的downloadURL,但我無法理解如何將其放置在那裏。如何將downloadUrl添加到firebaseDB對象?

我對將數據推送到FirebaseDB當前的代碼如下:

sendButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       menuItem menuItem = new menuItem(name.getText().toString(), description.getText().toString(), Integer.parseInt(price.getText().toString()), mChosenStorageRef.getDownloadUrl().toString()); 
       mChosenDBRef.push().setValue(menuItem); 
      } catch (NumberFormatException exception) { 
       Toast toast = Toast.makeText(MainActivity.this, R.string.price_error, Toast.LENGTH_LONG); 
       toast.show(); 
      } 

      name.setText(""); 
      description.setText(""); 
      price.setText(""); 

mChosenStorageRef.getDownloadUrl().toString()方法給我像「[email protected]」,而不是正確的URL。

我可以從下面的代碼中得到正確的donwloadURL,但我無法理解如何將它放到上面的push方法中。

uploadImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      Intent intent = new Intent(Intent.ACTION_PICK); 
      intent.setType("image/*"); 
      startActivityForResult(intent, RC_PHOTO_PICKER); 




     } 
    }); 


} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode == RC_PHOTO_PICKER) 
    { 

     Uri imageUri = data.getData(); 
     mChosenStorageRef = mChosenStorageRef.child(imageUri.getLastPathSegment()); 
     mChosenStorageRef.putFile(imageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
       Uri downloadUri = taskSnapshot.getDownloadUrl(); 


      } 
     }); 
    } 
} 

回答

0

的問題是更容易的話,我曾經期待。我將URI存儲在onCreate之外的URI變量中,稍後將其用於上傳方法。

需要學習java越來越多。感謝大家的關注和幫助。

private Uri downloadURL; 

sendButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      try { 
       menuItem menuItem = new menuItem(name.getText().toString(), description.getText().toString(), Integer.parseInt(price.getText().toString()), downloadURL.toString()); 
       mChosenDBRef.push().setValue(menuItem); 
      } catch (NumberFormatException exception) { 
       Toast toast = Toast.makeText(MainActivity.this, R.string.price_error, Toast.LENGTH_LONG); 
       toast.show(); 
      } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RC_PHOTO_PICKER) { 

     Uri imageUri = data.getData(); 


     mChosenStorageRef = mChosenStorageRef.child(imageUri.getLastPathSegment()); 
     mChosenStorageRef.putFile(imageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { 


      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 

       downloadURL = taskSnapshot.getDownloadUrl(); 
       Toast toast = Toast.makeText(MainActivity.this, "Successful", Toast.LENGTH_LONG); 
       toast.show(); 




      } 
     }); 
0

你只是得到Task<Uri>mChosenStorageRef.getDownloadUrl()

我有兩個想法,讓一個downloadUrl你。

  1. 保存taskSnapshot.getDownloadUrl()作爲字符串從PUTFILE的回調實例變量,那麼你可能發送,如果你需要對實時數據庫前檢查該變量的值。

    mDownloadUrl = taskSnapshot.getDownloadUrl().toString(); 
    
  2. 獲取downloadUrl從存儲,這樣,你需要一個回調響應第一,之後,你會得到的URI,然後將其轉換爲字符串,併發送到實時數據庫。

    mChosenStorageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener <Uri>() { 
        @Override public void onSuccess(Uri uri) { 
         mDownloadUrl = uri.toString(); 
         // Send datas to RTDB 
        } 
    }); 
    
+0

非常感謝你的回覆。我試圖用你描述的兩種方式,但我沒有得到解決方案。第一種方式給了我一些像[email protected]。第二種方法是將Url推送到數據庫,對。但是它將它推到了DB中的一個單獨的對象中,我不需要它。希望我正確理解你。 – Konstantin