'How to write live data in Piechart from local room database in Android?

I am Creating an Expense Manager App for that I want to fetch the data from the local room database and show it live on pieChart as Report. Here is the code

  1. Here is the code from debited.kt where I want to fetch the Data:
class debited : AppCompatActivity() {

    val db : DebitedDatabase by lazy { DebitedDatabase.getDatabase(this) }

    lateinit var viewModel: ExpenserViewModel
     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_debited)

       //setup()

        // Calendar
        val calender = Calendar.getInstance()
        val day =calender.get(Calendar.DAY_OF_MONTH)
        val month = calender.get(Calendar.MONTH)
        val year = calender.get(Calendar.YEAR)

        debitDate.setOnClickListener {

            val dbd = DatePickerDialog(this,DatePickerDialog.OnDateSetListener { view, mYear, mMonth, mDay ->

                // Setting the Selected Date to TextView
                debitDate.setText("" + mDay +  "/" + mMonth.plus(1) +  "/" + mYear)
            },year,month,day)

            dbd.show()
        }


        // Creating Anonymous class of onItemSelectedListener
        debitCategory.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{

            override fun onItemSelected(aview: AdapterView<*>?, view: View?, position: Int, id: Long) {

                val dc: String = aview?.getItemAtPosition(position).toString()

            }

            override fun onNothingSelected(aview: AdapterView<*>?) {

            }
        }

        // Adding On Click Listener to Button
        debitSave.setOnClickListener (View.OnClickListener {

            val dDate = debitDate.text.toString()
            val dAmount = debitAmount.text.toString()
            val dCategory = debitCategory.selectedItem.toString() // get data from debitCategory and showing it in textView
            val dNote = debitNote.text.toString()
            //val total = "$dDate, $dAmount, $dCategory, $dNote"

                 viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application))
                .get(ExpenserViewModel::class.java)

            viewModel.insert(DebitedData(dDate,"₹"+dAmount,dCategory,dNote))
            Log.d("Data", "$viewModel")
            Toast.makeText(this,"Data Saved",Toast.LENGTH_SHORT).show()


        })

    }

    }
  1. Here is the reportActivity.kt where the data will be Shown:
class report : AppCompatActivity() {

    val db: DebitedDatabase by lazy { DebitedDatabase.getDatabase(this) }
    lateinit var viewModel: ExpenserViewModel
    private lateinit var pieChart: PieChart
   
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_report)

        pieChart = findViewById(R.id.pieChart)

        setDataToPieChart()

        recyclerView.layoutManager = LinearLayoutManager(this)
        val adapter = recentRecyclerAdapter(this)
        recyclerView.adapter = adapter

        viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(
            ExpenserViewModel::class.java)


        viewModel.allData.observe(this, androidx.lifecycle.Observer { List ->
            List?.let {
                adapter.update(it)

            }
        })
    }

    private fun setDataToPieChart() {

        pieChart.setUsePercentValues(true)
        val dataEntries = ArrayList<PieEntry>()
        dataEntries.add(PieEntry(10f, debitCategory))

        val dataSet = PieDataSet(dataEntries, "")
        dataSet.valueTextSize=0f
        val colors = java.util.ArrayList<Int>()
        colors.add(Color.GRAY)
        colors.add(Color.BLUE)
        colors.add(Color.RED)
        colors.add(Color.GREEN)
        colors.add(Color.MAGENTA)

        dataSet.setColors(colors)

        val data = PieData(dataSet)
        pieChart.data = data
        pieChart.centerTextRadiusPercent = 0f
        pieChart.isDrawHoleEnabled = false
        pieChart.legend.isEnabled = false
        pieChart.description.isEnabled = false


    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source