2017-09-15 51 views
1

我目前正在尝试设置房间改造。我有一个工作实施...如何最好地设置房间和改造

它要求一个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

Google提供了一个很好的示例应用程序,它完全演示:https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample – Christopher

回答

0

我知道,你有房工作,并要解决房室内用库中的问题。但只是片刻,让我展示如何解决所谓Kripton Persistence Library另一个(开源)库,支持在SQLite的持久性(代码在编译时产生),并有整合改造了类似的问题。

你可以找到一个工作示例KriptonQuickStart。在这个例子中,我们从REST服务中检索数据,将其存储到SQLite数据库中,然后在UI上显示它们。

用户bean是该模型通过REST客户

@BindType 
public class User { 
    public long id; 
    public String name; 
    public String username; 
    public String email; 
    public Address address; 
    public String phone; 
    public String website; 
    public Company company; 
} 

QuickStartService下载是改造REST客户端定义

public interface QuickStartService { 

    @GET("users") 
    Call<List<User>> listUsers(); 
} 

用户DAO是用户实体DAO接口:

@BindDao(User.class) 
public interface UserDao { 

    @BindSqlInsert(includePrimaryKey = true) 
    void insert(User bean); 

    @BindSqlSelect(orderBy = "username asc") 
    List<User> selectAll(); 

    @BindSqlSelect(where="id = ${value}") 
    User selectById(@BindSqlParam("value") long id); 

} 

QuickStartDataSource是数据源定义:

@BindDataSource(daoSet={UserDao.class, PostDao.class, CommentDao.class, TodoDao.class, AlbumDao.class, PhotoDao.class}, fileName = "kripton.quickstart.db", generateAsyncTask = true) 
public interface QuickStartDataSource { 
} 

有关Kripton的更多信息可以参考herehere

相关问题