0

I have object with 2 string values, 1 int value and 1 array value. And when I add object on firebase, I see strings and int values in database,but not the array. Please, anybody help, how to add object with array value on firebase?

public class UploaderActivity extends AppCompatActivity {

    EditText ime;
    EditText opis;
    EditText cena;
    Button slikaj;
    Button dodaj;
    ArrayList<Uri> slike=new ArrayList<>();
    ArrayList<String> slike2=new ArrayList<>();
    UploadTask uploadTask;

    FirebaseStorage storage;
    StorageReference storageRef;
    StorageReference mountainImagesRef;

    DatabaseReference myRef;

    private FirebaseAuth mFirebaseAuth;
    private FirebaseUser mFirebaseUser;
    private DatabaseReference mDatabase;

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

        mFirebaseAuth = FirebaseAuth.getInstance();
        mFirebaseUser = mFirebaseAuth.getCurrentUser();
        mDatabase = FirebaseDatabase.getInstance().getReference();

        storage = FirebaseStorage.getInstance();
        storageRef = storage.getReferenceFromUrl("gs://materialdesign-fb467.appspot.com");

        ime= (EditText) findViewById(R.id.ime);
        opis= (EditText) findViewById(R.id.opis);
        cena= (EditText) findViewById(R.id.cena);
        slikaj= (Button) findViewById(R.id.slikaj);
        dodaj= (Button) findViewById(R.id.dodaj);


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

        if(requestCode==1 && resultCode==RESULT_OK && data!=null) {
            Uri selectedImage = data.getData();
            slike.add(selectedImage);

        }
    }
    public void slikaj(View view){

        Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i,1);



    }
    public void dodaj(View view){

        final ArrayList<Image> images;

        try {
            for (int i = 0; i < slike.size(); i++) {
                Bitmap bitmapImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), slike.get(i));
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmapImage.compress(Bitmap.CompressFormat.JPEG, 50, baos);
                byte[] dataBytes = baos.toByteArray();

                String pic = "Image" + i + ".jpg";

                mountainImagesRef = storageRef.child(usernameFromEmail(mFirebaseUser.getEmail())).child(ime.getText().toString()).child(pic);

                uploadTask = mountainImagesRef.putBytes(dataBytes);

                uploadTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        // Handle unsuccessful uploads
                        Toast.makeText(UploaderActivity.this, "There was an error - please try again!", Toast.LENGTH_SHORT).show();
                    }
                }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                        Uri downloadUrl = taskSnapshot.getDownloadUrl();
                        Image img = new Image(downloadUrl.toString());
                        Toast.makeText(UploaderActivity.this, downloadUrl.toString(), Toast.LENGTH_SHORT).show();
                        slike2.add(img.getUrl());

                    }
                } );
            }

                        //DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("trails").child(usernameFromEmail(mFirebaseUser.getEmail())).child(trail.getUnique_id()).push();
                        myRef = FirebaseDatabase.getInstance().getReference().child("Items").child(usernameFromEmail(mFirebaseUser.getEmail())).child(ime.getText().toString()).push();
                        Item item = new Item(ime.getText().toString(),opis.getText().toString(),Integer.parseInt(cena.getText().toString()),slike2);
                        myRef.setValue(item);
                        Toast.makeText(UploaderActivity.this, "Your image has been posted!", Toast.LENGTH_SHORT).show();

                    } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    };




    private String usernameFromEmail(String email) {

        if (email.contains("@")) {
            return email.split("@")[0];
        } else {
            return email;
        }
    }
}





public class Item {

    private String name;
    private String desription;
    private int price;
    private ArrayList<String> url;

    public Item(){}
    public Item(String name, String desription, int price, ArrayList<String> url){
        this.name=name;
        this.desription=desription;
        this.price=price;
        this.url=url;
    }
    public Item(String name,String desription,int price){
        this.name=name;
        this.desription=desription;
        this.price=price;

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesription() {
        return desription;
    }

    public void setDesription(String desription) {
        this.desription = desription;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public ArrayList<String> getUrl() {

        return url;
    }

    public void setUrl(ArrayList<String> url) {

        this.url = url;
    }
}

1 Answer 1

1

The upload of the image bytes is performed on a worker thread and takes some time to transfer the data to the Firebase servers. The OnSuccessListener that you use to add URLs to array list slike2 fires asynchronously, long after this code that follows it executes:

Item item = new Item(ime.getText().toString(),opis.getText().toString(),
        Integer.parseInt(cena.getText().toString()),slike2);
myRef.setValue(item);
Toast.makeText(UploaderActivity.this, "Your image has been posted!",
        Toast.LENGTH_SHORT).show();

The result is that item is stored correctly, but does not contain the list of URLs, because slike2 is empty.

The Tasks class provides methods to create a task that completes when a collection of tasks completes. Consider using those capabilities to rework your code.

Sign up to request clarification or add additional context in comments.

3 Comments

thanks for advice man,but i stil dont know how to do that(i'm begginer)...please,can you show me how to rework my code to use Tasks class ?
I would be very grateful
I'll take a look when I have time. Have you run this code and looked at memory usage? You can do that using the Android Monitor in Android Studio. I think queuing up a number of image uploads is going to take too much memory. The image byte arrays will be retained until the upload finishes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.