Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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 :)