如何最好地设置房间和改造

时间:2017-09-15 05:42:23

标签: java android rx-java retrofit2 android-room

我目前正在尝试使用Retrofit设置Room。我有一个有效的实施......

它请求ApiItemBean,然后ApiDatabase调用其ApiItemDAO将数据库或新ApiItemApiItemBean映射到Single<ApiItem> }。

ApiRepositoryApiRequest中使用了该单词,并最终在比喻Usage中订阅。

ApiItemBean

  public class ApiItemBean {
    private final int a;
    private final int b;
    public ApiItemBean(int a, int b) {
      this.a = a;
      this.b = b;
    }
    public int a() {
      return a;
    }
    public int b() {
      return b;
    }
  }

ApiItem

  @Entity(tableName = "api_item") public static class ApiItem {
    @PrimaryKey private final int id;
    ApiItem(int id) {
      this.id = id;
    }
    public int id() {
      return id;
    }
  }

ApiItemDAO

  @Dao public interface ApiItemDAO {
    @Insert(onConflict = OnConflictStrategy.REPLACE) long insert(ApiItem apiItem);
    @Query("SELECT * FROM api_item WHERE id = :id") ApiItem apiItem(int id);
  }

ApiDatabase

  @Database(entities = { ApiItem.class }, version = 1) abstract class ApiDatabase extends RoomDatabase {
    abstract ApiItemDAO apiItemDAO();
    // More...

    Single<ApiItem> mapApiItem(ApiItemBean apiItemBean) {
      final ApiItem apiItem = new ApiItem(apiItemBean.a());
      final ApiItem apiItemDb = apiItemDAO().apiItem(apiItem.id());
      if (apiItemDb == null || !apiItemDb.equals(apiItem))
        Log.i(getClass().getSimpleName(), String.format("insert=%s", apiItemDAO().insert(apiItem)));
      return Single.just(apiItemDAO().apiItem(apiItem.id()));
    }
    // More...
  }

ApiRequest

  public interface ApiRequest {
    @GET("API_ITEM_BEAN_REQUEST") Single<ApiItemBean> getApiItemBean();
    // More...
  }

ApiRepository

  public class ApiRepository {
    private final ApiRequest apiRequest;
    private final ApiDatabase apiDatabase;
    ApiRepository(ApiRequest apiRequest, ApiDatabase apiDatabase) {
      this.apiRequest = apiRequest;
      this.apiDatabase = apiDatabase;
    }
    Single<ApiItem> getApiItem() {
      return apiRequest.getApiItemBean().flatMap(apiDatabase::mapApiItem);
    }
    // More...
  }

用法

  public class Usage {
    private final ApiRepository apiRepository;
    Usage(ApiRepository apiRepository) {
      this.apiRepository = apiRepository;
    }
    public void onUse() {
      apiRepository.getApiItem().subscribe();
    }
  }

我不确定如何最好地检查针对数据库的请求。请参阅ApiDatabase::mapApiItem,了解我的想法。

旁注:我知道没有具体问题,应该可以转移到CodeReview,但是代码示例并不完全正常,因为它需要依赖于特定的api,我认为最好先尝试一下。对不起任何mods。

0 个答案:

没有答案