我目前正在尝试使用Retrofit设置Room。我有一个有效的实施......
它请求ApiItemBean
,然后ApiDatabase
调用其ApiItemDAO
将数据库或新ApiItem
与ApiItemBean
映射到Single<ApiItem>
}。
ApiRepository
在ApiRequest
中使用了该单词,并最终在比喻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。