Repository
Repository是一個可處理不同數據來源的類,看是從網路獲取數據還是本地獲取,調用時不需要再去知道獲取數據的細節。
Repository會有兩種讀取操作,所以前兩天先講解Room與Retrofit,今天將兩者結合放到Repository當中並調用裡面的方法,導入方式以及程式碼的撰寫可以參考前兩章。
這邊傳入application是為了創建Database
class DemoRepository(application: Application) {
private var demoDao: DemoDao = DemoDatabase.getInstance(application).demoDao()
private val myService by lazy { RetrofitUtil.instance.getService(MyService::class.java) }
//即時獲取資料庫所有資料
fun getAllDemo(): LiveData<List<Demo>> {
return demoDao.getAllDemo()
}
//本地新增資料
fun localInsert() {
CoroutineScope(Dispatchers.IO).launch {
val demo = Demo()
demo.info = "Hello Jetpack"
demoDao.insert(demo)
}
}
//網路新增資料
fun networkInsert() {
CoroutineScope(Dispatchers.IO).launch {
val data = myService.getPage().data
val demo = Demo()
for (index in data.indices) {
demo.info = data[index].desc
demoDao.insert(demo)
sleep(500) //是為了方便展示資料的新增 平時不需要
}
}
}
}
這邊完全不用操作任何讀取數據,只要調用方法
class MainActivity : AppCompatActivity() {
private val demoRepository by lazy { DemoRepository(application) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
demoRepository.getAllDemo().observe(this, Observer {
if (it.isNotEmpty())
info.text = it[it.size-1].info
title = it.size.toString()
})
}
//調用Repository裡的本地新增
fun local(view: View) {
demoRepository.localInsert()
}
//調用Repository裡的網路新增
fun network(view: View) {
demoRepository.networkInsert()
}
}