将数据从Room返回到ViewModel,然后使用来自网络服务的新数据更新ViewModel

时间:2019-09-17 12:51:18

标签: android android-room android-livedata

我有一个ViewModel,并且我正在使用LiveData,所以我有一个DAO返回LiveData>,我可以使它工作,但实际上我希望它首先显示Room数据库中的数据(如果有的话),并且然后,当Web服务返回新数据(如果有)时,将其写入数据库,然后使用数据库中的最新数据更新ViewModel。我不仅可以从数据库中返回数据,而且还可以在后台将新数据写入数据库,但是那又如何使ViewModel再次从数据库中读取/更新新数据呢?

谢谢
索伦

1 个答案:

答案 0 :(得分:1)

您可以使DAO返回LiveData<Any>。这意味着您可以收到有关该实体的每次更改的通知。

假设您有一个User实体:

@Entity
data class User(
    @PrimaryKey(autoGenerate = true) var uid: Int = 0,

    @ColumnInfo(name = "name")
    val name: String
)

其相关的DAO看起来像:

@Dao
interface UserDao {

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

    @Insert
    suspend fun insert(vararg users: User)
}

因此,您只需要将all的结果展示给您的视图层即可:

class UserViewModel : ViewModel() {

    val users: LiveData<List<User>> = userDao.all()
}

class UserActivity : AppCompatActivity() {
    private val viewModel by viewModels<UserViewModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel.users.observe(this, Observer { users ->
            // show data
        })
    }
}

现在,如果您插入一个新的User,您的观察员将被呼叫。

这是如何从DAO中获取更新数据的基本思想。但是对于您而言,您实际要做的是创建一个Repository,并在其中执行您的业务逻辑,提供脱机优先数据,然后尝试从网络获取数据并更新数据库。