Android 架构组件 - 从房间中删除旧数据

Android Architecture Components - Remove old data from room

目前我正在研究 Android 应用程序架构,我无法理解 Github Repo 示例中的一件事;我们可以决定使用速率限制器或空检查来获取新数据,但在这种情况下,我们只是将新值插入数据库,而不是从数据库中删除旧值。例如,如果数据库中的旧结果之一从服务器中删除(用户删除的回购)怎么办?它还会在数据库中吗?我们如何消除这种价值观?我是不是遗漏了什么或者这是一个未处理的案例?

好的,我想出了一个解决方案;

这是示例实体,

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

以下是取自 https://jsonplaceholder.typicode.com 的示例 json 并重新格式化。

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

通过使用 https://github.com/FasterXML/jackson-module-kotlin,您可以轻松地将 json 格式的数据反序列化为 kotlin 中的数据 类。与 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)

这个解决方案对我有用。但我也很高兴听到你的解决方案。

我想我有一个优化且更简单的解决方案。请帮忙让它变得更简单!

// Dao class

@Dao
public interface UserDao {
    // ...    

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<User> users);

    @Query("DELETE FROM User WHERE User.id NOT IN(:lstIDUsers)")
    void deleteOldUsers(List<Integer> lstIDUsers);
}  

// 调用 Dao 的文件 - 示例:Repository class)

// First, convert and add all Json data to lstUsers

// Second, add only Json primary key elements 
// from lstUsers to a new list lstIDUsers

userDao.insertAll(lstUsers);
userDao.deleteOldUsers(lstIDUsers);

这两个命令首先插入所有带有 OnConflictStrategy.REPLACE 的元素,然后仅删除从远程或本地数据库中删除的旧元素。