2017-11-17 8 views
0

現在、私はAndroidアプリケーションアーキテクチャで作業していますが、Github Repoサンプルの1つのことを理解できません。レートリミッタやヌルチェックを使用して新しいデータを取得することもできますが、この場合はデータベースに新しい値を挿入するだけで、データベースから古い値を削除することはありません。たとえば、データベース内の古い結果の1つがサーバーから削除された場合(ユーザーが削除したrepo)それはまだデータベースにありますか?どのようにしてこの値を排除できますか?何か不足しているのですか?これは未処理のケースですか?Androidアーキテクチャーコンポーネント - 古いデータをルームから削除する

答えて

0

私は解決策が付いてきました。

これは、エンティティ、

@Entity 
data class User(
     @PrimaryKey val uid : Int, 
     val name : String, 
     val createdTime : Long = System.currentTimeMillis() 
) 

以下は、例えば、JSONはhttps://jsonplaceholder.typicode.com から採取し、再フォーマットした例です。あなたはkotlinのデータクラスに簡単にJSON形式のデータをデシリアライズすることができhttps://github.com/FasterXML/jackson-module-kotlinを使用して

private val userJson = "[{\"uid\": 1,\"name\": \"Leanne Graham\"},{\"uid\": 2,\"name\": \" Graham\"},{\"uid\": 3,\"name\": \"Y Graham\"},{\"uid\": 4,\"name\": \"Lea\"}]" 

。 gsonライブラリとは異なり、jaksonはデフォルト値をサポートしているので、作成された時間を現在のミリ秒単位で設定できます。以下はUserDao

@Dao 
interface UserDao { 
    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    fun insertUser(user : User) 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    fun insertUsers(user : List<User>) 

    @Query("SELECT * FROM user") 
    fun getUsers() : List<User> 

    @Delete() 
    fun deleteOldUsers(users : List<User>) 

です。getUser()メソッドを使用してすべてのユーザーを取得し、古いものや新鮮なものとしてフィルタリングすることができます。データベースより古いものを削除する必要があります。また、freshUsersが空でない場合はそれを使用し、空の場合は新しいネットワーク要求を作成します。

val expireTime = TimeUnit.HOURS.toMillis(1) 
val userList = App.database.userDao().getUsers() 
val freshUsers = userList.filter { it.createdTime > System.currentTimeMillis() - expireTime} 
val oldUsers = userList.filter { it.createdTime < System.currentTimeMillis() - expireTime} 
App.database.userDao().deleteOldUsers(oldUsers) 

この解決策は私のために働いています。しかし、私もあなたのソリューションを聞いてうれしいです。

関連する問題