Как обновить arrayList в облачном Firestore в Android - PullRequest
0 голосов
/ 11 декабря 2018

Работая с облачным пожарным хранилищем, всегда полезно помнить о количестве прочитанных документов.Я работаю над приложением инвентаризации, в котором создается счет для списка продуктов наряду с другими деталями.Все работает нормально, кроме обновления arraylist в счете.Я могу вставить список товаров вместе с другими деталями в счет, но я не могу обновить список позже.Всякий раз, когда я пытаюсь вставить в документ больше arraylist, старый arraylist удаляется.Я не понимаю, как вставить больше записей в этот массив.

private void loadDatatoFirestore() {
        //product details entry
        final ArrayList<OrderedProductModel> newProductModel = new ArrayList<>();
        for (int i=0; i<productModelList.size(); i++){
            OrderedProductModel model = new OrderedProductModel(productModelList.get(i).getProductNumber(),
                    productModelList.get(i).getProductName(),
                    productModelList.get(i).getOrderedQuantity(),
                    productModelList.get(i).getSellingPrice());
            newProductModel.add(model);
        }

       BillModel insertBill = new BillModel(billNumber, partyName, date, totalPrice, BILL_STATUS, newProductModel);

        db.collection("mainCollection").document("BillDocument")
                .collection("BillCollection")
                .document(billNumber)
                .set(insertBill, SetOptions.merge())
                .addOnSuccessListener(new OnSuccessListener<Void>() {...}  

приведенный выше код работает нормально ... но теперь я хочу вставить больше записей в массив orderderProduct.Я пытаюсь решить это так, но возникает ошибка времени компиляции.Я не знаю, как обновить массив здесь.

private void updateBill(String billNumber) {
      //here i am trying to insert dummy data 
        ArrayList<OrderedProductModel> testArray = new ArrayList<>();
        testArray.add(new OrderedProductModel("9999","testprod1",50,40));
        testArray.add(new OrderedProductModel("9911","testprod2",70,60));
        BillModel billtest = new BillModel(testArray);
        db.collection("mainCollection").document("BillDocument")
                .collection("BillCollection")
                .document(billNumber)
                .update(billtest,SetOptions.merge())
                .addOnSuccessListener(new OnSuccessListener<Void>() {....}

BillModel

public class BillModel {
    String billNumber;
    String partyName;
    String billingDate;
    float totalPrice;
    String status;
    ArrayList<OrderedProductModel> orderderProduct;

    public BillModel(ArrayList<OrderedProductModel> orderderProduct) {
        this.orderderProduct = orderderProduct;
    }

    public BillModel(String billNumber, String partyName, String billingDate, float totalPrice, String status, ArrayList<OrderedProductModel> orderderProduct) {
        this.billNumber = billNumber;
        this.partyName = partyName;
        this.billingDate = billingDate;
        this.totalPrice = totalPrice;
        this.status = status;
        this.orderderProduct = orderderProduct;
    }

OrderedProductModel

public class OrderedProductModel {
    private String productNumber;
    private String productName;
    private int orderedQuantity;
    private float sellingPrice;

    public OrderedProductModel(String productNumber, String productName, int orderedQuantity, float sellingPrice) {
        this.productNumber = productNumber;
        this.productName = productName;
        this.orderedQuantity = orderedQuantity;
        this.sellingPrice = sellingPrice;
    }

Прикрепление изображения ... изображение пожарного магазина
изображение создания счета

1 Ответ

0 голосов
/ 11 декабря 2018

Если вы хотите обновить содержимое типа массива в Firestore, вы не можете просто объединить новый массив.Новое значение поля всегда полностью заменяет старое значение поля во время слияния.

Если вы хотите изменить содержимое массива, вы должны использовать специальное FieldValue.arrayUnion () операция в качестве значения для вашего поля.

В соответствии с документами API:

Возвращает специальное значение, которое можно использовать с set () или update (), который говорит серверу объединить данные элементы с любым значением массива, которое уже существует на сервере.Каждый указанный элемент, который еще не существует в массиве, будет добавлен в конец.Если изменяемое поле уже не является массивом, оно будет перезаписано массивом, содержащим точно указанные элементы.

Это более подробно описано в документации .

К сожалению, это несовместимо с автоматическим сопоставлением полей, которое происходит с объектами Java POJO, как вы используете с BillModel.Вместо этого вам придется преобразовать свой код, чтобы обновить документ с помощью объекта типа «Карта», вручную скопировав в него значения для каждого из полей BillModel, которые вы хотите изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...