iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
1

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()
    }
}


上一篇
{Day10} Retrofit
下一篇
{Day12} DataBinding
系列文
Kotlin Android Jetpack 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言