10
respostas

Salvar dados vindos do servidor no Sq Lite com Room

Bom dia, preciso de uma ajuda!

Estou utilizando o retrofit e recebo a seguinte resposta do servidor.

2021-07-22 07:31:27.647 4606-4676/com.example.appmarket I/okhttp.OkHttpClient: {"status":"success","shoppingLists":[{"id":2,"month":"Julho","year":2021,"start":"2021-06-14","end":"2021-06-16","status":"Fechada","discount":null,"created_by":1,"shopping_list_type_id":1,"created_at":"2021-06-14T14:58:28.000000Z","updated_at":"2021-06-17T04:00:29.000000Z"}]}

esse é o meu Model.java

package com.example.appmarket.model;

import androidx.room.Embedded;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;

import org.jetbrains.annotations.NotNull;

import java.io.Serializable;


@Entity
public class Lista implements Serializable {

    @PrimaryKey
    @NotNull
    private String status;

    @Embedded
    private Lista.ShoppingList shoppingList;

    public Lista(){

    }

    @NotNull
    public String getStatus() {
        return status;
    }

    public void setStatus(@NotNull String status) {
        this.status = status;
    }

    public Lista.ShoppingList getShoppingList() {
        return shoppingList;
    }

    public void setShoppingList(Lista.ShoppingList shoppingList) {
        this.shoppingList = shoppingList;
    }

    public class ShoppingList implements Serializable{

        @PrimaryKey
        @NotNull
        private int id;
        private String month;
        private int year;
        private String start;
        private String end;
        @Ignore
        private String status;
        private int discount;
        private int created_by;
        private int shopping_list_type_id;
        private String created_at;
        private String updated_at;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getMonth() {
            return month;
        }

        public void setMonth(String month) {
            this.month = month;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public String getStart() {
            return start;
        }

        public void setStart(String start) {
            this.start = start;
        }

        public String getEnd() {
            return end;
        }

        public void setEnd(String end) {
            this.end = end;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public int getDiscount() {
            return discount;
        }

        public void setDiscount(int discount) {
            this.discount = discount;
        }

        public int getCreated_by() {
            return created_by;
        }

        public void setCreated_by(int created_by) {
            this.created_by = created_by;
        }

        public int getShopping_list_type_id() {
            return shopping_list_type_id;
        }

        public void setShopping_list_type_id(int shopping_list_type_id) {
            this.shopping_list_type_id = shopping_list_type_id;
        }

        public String getCreated_at() {
            return created_at;
        }

        public void setCreated_at(String created_at) {
            this.created_at = created_at;
        }

        public String getUpdated_at() {
            return updated_at;
        }

        public void setUpdated_at(String updated_at) {
            this.updated_at = updated_at;
        }
    }
}

quando tento acessar a resposta do servidor , ele vem null .

call.enqueue(new Callback<Lista>() {
    @Override
    public void onResponse(Call<Lista> call, Response<Lista> response) {
        Lista lista = response.body();
        Log.i("DADOS LISTA", lista.getStatus());
        Log.i("DADOS LISTA", String.valueOf(lista.getShoppingList()));
    }

    @Override
    public void onFailure(Call<Lista> call, Throwable t) {

    }
});


021-07-22 07:51:07.550 7042-7042/com.example.appmarket I/DADOS LISTA: success

2021-07-22 07:51:07.550 7042-7042/com.example.appmarket I/DADOS LISTA: null

Acho que algo em meu model está errado, para receber esse array de objetos.

Agradeço desde já pela ajuda

10 respostas

Seu objeto chama shoppingList e na api shoppingLists por isso não tá conseguindo fazer o binding, tenta alterar isso e ve se da certo :)

Obrigada pela observação... mas, não é a solução! Agora ele nem aparece no Log.

Log.i("DADOS LISTA", lista.getStatus()); Log.i("DADOS LISTA", lista.getShoppingLists().getMonth());

Estou achando que deve ser algo por conta do shoppingLists ser um array. Só achando mesmo, sou novata na programação.

Não tinha reparado na modelagem ali, mas sim, se é um array, tu precisa fazer com que a propriedade seja uma lista desse objeto, algo assim:

private List<Lista.ShoppingList> shoppingLists;

Isso deve solucionar seu problema :)

Uma mudança tipo isso?

package com.example.appmarket.model;

import androidx.room.Embedded; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey;

import org.jetbrains.annotations.NotNull;

import java.io.Serializable; import java.util.List;

@Entity public class Lista implements Serializable {

@PrimaryKey
@NotNull
private String status;
private ShoppingLists shoppingLists;

@NotNull
public String getStatus() {
    return status;
}

public void setStatus(@NotNull String status) {
    this.status = status;
}

public ShoppingLists getShoppingLists() {
    return shoppingLists;
}

public void setShoppingLists(ShoppingLists shoppingLists) {
    this.shoppingLists = shoppingLists;
}

class ShoppingLists implements Serializable{
    @PrimaryKey
    @NotNull
    private int id;
    private String month;
    private int year;
    private String start;
    private String end;
    @Ignore
    private String status;
    private int discount;
    private int created_by;
    private int shopping_list_type_id;
    private String created_at;
    private String updated_at;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getMonth() {
        return month;
    }

    public void setMonth(String month) {
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getStart() {
        return start;
    }

    public void setStart(String start) {
        this.start = start;
    }

    public String getEnd() {
        return end;
    }

    public void setEnd(String end) {
        this.end = end;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public int getDiscount() {
        return discount;
    }

    public void setDiscount(int discount) {
        this.discount = discount;
    }

    public int getCreated_by() {
        return created_by;
    }

    public void setCreated_by(int created_by) {
        this.created_by = created_by;
    }

    public int getShopping_list_type_id() {
        return shopping_list_type_id;
    }

    public void setShopping_list_type_id(int shopping_list_type_id) {
        this.shopping_list_type_id = shopping_list_type_id;
    }

    public String getCreated_at() {
        return created_at;
    }

    public void setCreated_at(String created_at) {
        this.created_at = created_at;
    }

    public String getUpdated_at() {
        return updated_at;
    }

    public void setUpdated_at(String updated_at) {
        this.updated_at = updated_at;
    }
}

}

DESCONSIDERE O ULTIMO POST..... ESTÁ ERRADO

VOU TENTAR AQUI E POSTO NOVAMENTE...

CONSEGUI ACESSAR...

2021-07-22 12:10:45.850 31137-31293/com.example.appmarket I/okhttp.OkHttpClient: {"status":"success","shoppingLists":[{"id":2,"month":"Julho","year":2021,"start":"2021-06-14","end":"2021-06-16","status":"Fechada","discount":null,"created_by":1,"shopping_list_type_id":1,"created_at":"2021-06-14T14:58:28.000000Z","updated_at":"2021-06-17T04:00:29.000000Z"}]} 2021-07-22 12:10:45.851 31137-31293/com.example.appmarket I/okhttp.OkHttpClient: <-- END HTTP (277-byte body) 2021-07-22 12:10:45.887 31137-31137/com.example.appmarket I/DADOS LISTA: success 2021-07-22 12:10:45.887 31137-31137/com.example.appmarket I/DADOS: 2 2021-07-22 12:10:45.887 31137-31137/com.example.appmarket I/DADOS: Julho 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 2021 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 2021-06-14 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 2021-06-16 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: Fechada 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 0 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 1 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 1 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 2021-06-14T14:58:28.000000Z 2021-07-22 12:10:45.888 31137-31137/com.example.appmarket I/DADOS: 2021-06-17T04:00:29.000000Z

call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Lista lista = response.body(); Log.i("DADOS LISTA", lista.getStatus()); int i = 0; Log.i("DADOS", String.valueOf(lista.getShoppingLists().get(i).getId())); Log.i("DADOS", lista.getShoppingLists().get(i).getMonth()); Log.i("DADOS", String.valueOf(lista.getShoppingLists().get(i).getYear())); Log.i("DADOS", lista.getShoppingLists().get(i).getStart()); Log.i("DADOS", lista.getShoppingLists().get(i).getEnd()); Log.i("DADOS", lista.getShoppingLists().get(i).getStatus()); Log.i("DADOS", String.valueOf(lista.getShoppingLists().get(i).getDiscount())); Log.i("DADOS", String.valueOf(lista.getShoppingLists().get(i).getCreated_by())); Log.i("DADOS", String.valueOf(lista.getShoppingLists().get(i).getShopping_list_type_id())); Log.i("DADOS", lista.getShoppingLists().get(i).getCreated_at()); Log.i("DADOS", lista.getShoppingLists().get(i).getUpdated_at()); }

O NOVO MODEL...

package com.example.appmarket.model;

import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey;

import org.jetbrains.annotations.NotNull;

import java.io.Serializable; import java.util.List;

public class Lista implements Serializable{

@PrimaryKey
@NotNull
private String status;

private List<Lista.ShoppingLists> shoppingLists;

@NotNull
public String getStatus() {
    return status;
}

public void setStatus(@NotNull String status) {
    this.status = status;
}

public List<ShoppingLists> getShoppingLists() {
    return shoppingLists;
}

public void setShoppingLists(List<ShoppingLists> shoppingLists) {
    this.shoppingLists = shoppingLists;
}

public static class ShoppingLists implements Serializable{

    @PrimaryKey
    @NotNull
    private int id;
    private String month;
    private int year;
    private String start;
    private String end;
    private String status;
    private int discount;
    private int created_by;
    private int shopping_list_type_id;
    private String created_at;
    private String updated_at;

    public ShoppingLists(int id, String month, int year, String start, String end,
                         String status, int discount, int created_by,
                         int shopping_list_type_id, String created_at, String updated_at) {
        this.id = id;
        this.month = month;
        this.year = year;
        this.start = start;
        this.end = end;
        this.status = status;
        this.discount = discount;
        this.created_by = created_by;
        this.shopping_list_type_id = shopping_list_type_id;
        this.created_at = created_at;
        this.updated_at = updated_at;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getMonth() {
        return month;
    }

    public void setMonth(String month) {
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getStart() {
        return start;
    }

    public void setStart(String start) {
        this.start = start;
    }

    public String getEnd() {
        return end;
    }

    public void setEnd(String end) {
        this.end = end;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public int getDiscount() {
        return discount;
    }

    public void setDiscount(int discount) {
        this.discount = discount;
    }

    public int getCreated_by() {
        return created_by;
    }

    public void setCreated_by(int created_by) {
        this.created_by = created_by;
    }

    public int getShopping_list_type_id() {
        return shopping_list_type_id;
    }

    public void setShopping_list_type_id(int shopping_list_type_id) {
        this.shopping_list_type_id = shopping_list_type_id;
    }

    public String getCreated_at() {
        return created_at;
    }

    public void setCreated_at(String created_at) {
        this.created_at = created_at;
    }

    public String getUpdated_at() {
        return updated_at;
    }

    public void setUpdated_at(String updated_at) {
        this.updated_at = updated_at;
    }
}

}

PROBLEMA ATUAL...

Quando coloco @Entity na classe model, ele não sabe como salvar um list até fala sobre conversor.

Estou usando o SQ Lite com Room;

Se tiver algo que me oriente nesse sentido agradeço muito..

Se tiver alguma opinião de como melhorar o código.. fico feliz também!

Muito obrigada pela atenção

/home/julia/AndroidStudioProjects/aplicativoDoMercado/AppMercado/app/src/main/java/com/example/appmarket/model/Lista.java:19: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. private List<Lista.ShoppingLists> shoppingLists; ^

No caso, você vai ter que fazer outro objeto.

Essa resposta da api, é o que chamamos de DTO - data transfer object-, que serve apenas para resgatar os dados de um sistema externo, pra parte interna, tu tem que criar 2 entidades, uma pra cada item da lista e a outra que vai possuir os itens, minha sugestão é que você leia essa pagina da documentação para conseguir implementar isso :)