首页 > 解决方案 > 使用 RoomDatabase 使用 Retrofit 获取数据获取错误

问题描述

我正在使用改造来获取数据,并且我想将数据存储在本地数据库中,所以我使用了 RoomDatabase。这是https://reqres.in/api/users的 api

{"page":1,"per_page":6,"total":12,"total_pages":2,"data":[{"id":1,"email":"george.bluth@reqres.in","first_name":"George","last_name":"Bluth","avatar":"https://reqres.in/img/faces/1-image.jpg"},{"id":2,"email":"janet.weaver@reqres.in","first_name":"Janet","last_name":"Weaver","avatar":"https://reqres.in/img/faces/2-image.jpg"},{"id":3,"email":"emma.wong@reqres.in","first_name":"Emma","last_name":"Wong","avatar":"https://reqres.in/img/faces/3-image.jpg"},

这是我想用 per_page=3 获取的数据。下面是我的数据模型

    @Entity(tableName = "userdata",indices = @Index(value = {"id"},unique = true))

public class DataModel {
    @PrimaryKey@NonNull
    @SerializedName("id")
    @ColumnInfo(name = "id")
    int id;



    @SerializedName("email")
    @ColumnInfo(name = "email")
    String email;

    @SerializedName("first_name")
    @ColumnInfo(name = "first_name")
    String first_name;

    @SerializedName("last_name")
    @ColumnInfo(name = "last_name")
    String last_name;

    @SerializedName("avatar")
    @ColumnInfo(name = "avatar")
    String avatar;

    public int getId() {
        return id;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
}

这是我的 ApiInterface

public interface UserApi {
    @GET("/api/users?")

    Call<List<DataModel>> getAllUers
    (

            @Query("per_page") int per_page
    );
}

下面是我的 MainActivity

public class MainActivity extends AppCompatActivity {
    private User_ViewModel userViewModel;
    private List<DataModel> getUsers;
    private UserAdpater userAdpater;
    private RecyclerView recyclerView;
    private UserRepository repository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        repository=new UserRepository(getApplication());
        getUsers=new ArrayList<>();
        recyclerView=findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));


        userViewModel=new ViewModelProvider(this).get(User_ViewModel.class);
        userAdpater=new UserAdpater(this,getUsers);

        makeRequest();

        userViewModel.getGetAllUsers().observe(this, new Observer<List<DataModel>>() {
            @Override
            public void onChanged(List<DataModel> dataModels) {
                recyclerView.setAdapter(userAdpater);
                userAdpater.getAllDatas(dataModels);
                Log.d("main", "onChanged: "+dataModels);
            }
        });

    }

    private void makeRequest() {
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("https://reqres.in")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        UserApi api=retrofit.create(UserApi.class);
        Call<List<DataModel>>call=api.getAllUers(5);

        call.enqueue(new Callback<List<DataModel>>() {
            @Override
            public void onResponse(Call<List<DataModel>> call, Response<List<DataModel>> response) {

                if (response.isSuccessful())
                {
                    repository.insert(response.body());
                }
            }

            @Override
            public void onFailure(Call<List<DataModel>> call, Throwable t) {
                Log.d("main", "onFailure: "+t.getMessage());
            }
        });

    }
}

那么如何实现它。如果我制作 DataModel 并为这样的数据制作另一个类它会抛出一个错误 - 无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

@Entity
public class DataModel {

    @SerializedName("page")
    public Integer page;
    @SerializedName("per_page")
    public Integer perPage;
    @SerializedName("total")
    public Integer total;
    @SerializedName("total_pages")
    public Integer totalPages;
    @SerializedName("data")
    public List<Datum> data = new ArrayList<>();

标签: androidretrofitretrofit2android-room

解决方案


推荐阅读