Создание диаграммы из данных, содержащихся в MVVM - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть к вам вопрос. Я только начинаю программировать на android, и меня вдохновила проблема, которую я не могу решить. Я много искал по inte rnet, но что-то не получается. Я не ожидаю определенного c кода, просто помогите мне добраться до пункта назначения. У меня есть приложение, которое записывает результаты глюкозы. База данных является моделью MVVM. Моя цель - создать диаграмму, которая будет обновляться с добавлением нового измерения. И вот проблема, которую я смог создать, простая диаграмма, в которую я уже ввел данные. Я не знаю, как преобразовать его сейчас, чтобы извлечь данные из базы данных и поместить их на график после добавления теста.

Легенда: Stezen ie = Это моя цель. На моем языке слово "Stezen ie" означает глюкозу. Это числовое значение, которое нужно перенести на график.

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

package com.example.mwproto1

import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.provider.CalendarContract
import androidx.appcompat.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import androidx.room.Dao
import com.example.mwproto1.Note.BazaWynikow
import com.example.mwproto1.ROOM.PomiarDao
import com.example.mwproto1.UI.Analiza
import com.example.mwproto1.UI.Dzienniczek
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.components.AxisBase
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.data.LineData
import com.github.mikephil.charting.data.LineDataSet
import com.github.mikephil.charting.formatter.IAxisValueFormatter
import com.github.mikephil.charting.formatter.ValueFormatter
import com.github.mikephil.charting.highlight.Highlight
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet
import com.github.mikephil.charting.listener.OnChartValueSelectedListener

import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity(), OnChartValueSelectedListener {

    val xValsDateLabel = ArrayList<String>()
    private lateinit var Wykres:LineChart
    private var entries = java.util.ArrayList<Entry>()

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

        fab.setOnClickListener { view ->
            val intent = Intent(this, Dzienniczek::class.java)
            startActivity(intent)
        }

        FabPrzypomnienia.setOnClickListener { view ->

            val startMillis: Long = Calendar.getInstance().run {
                set(2020, 2, 27, 7, 30)
                timeInMillis
            }
            val endMillis: Long = Calendar.getInstance().run {
                set(2019, 11, 10, 8, 30)
                timeInMillis
            }
            val intent = Intent(Intent.ACTION_INSERT)
                .setData(CalendarContract.Events.CONTENT_URI)
                .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis)
                .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMillis)
                .putExtra(CalendarContract.Events.TITLE, "")
                .putExtra(CalendarContract.Events.DESCRIPTION, "")
                .putExtra(CalendarContract.Events.EVENT_LOCATION, "")
                .putExtra(
                    CalendarContract.Events.AVAILABILITY,
                    CalendarContract.Events.AVAILABILITY_BUSY
                )
            startActivity(intent)
        }

        //Chart

        Wykres = findViewById(R.id.Wykres)
        entries.add(Entry(0f, 5f))
        entries.add(Entry(1f, 10f))
        entries.add(Entry(2f, 15f))
        entries.add(Entry(3f, 20f))
        entries.add(Entry(4f, 5f))
        entries.add(Entry(5f, 10f))

        val set1 = LineDataSet(entries, "Water")
        set1.fillAlpha = 110

        val dataSet = java.util.ArrayList<ILineDataSet>()
        dataSet.add(set1)

        val lineData = LineData(dataSet)
        Wykres.data = lineData

        set1.color = Color.RED
        set1.mode = LineDataSet.Mode.CUBIC_BEZIER
        Wykres.description.text = ""
        Wykres.legend.isEnabled = false
        Wykres.invalidate()
        Wykres.axisRight.isEnabled = false
        Wykres.axisLeft.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
        Wykres.axisRight.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)


        val xAxis = Wykres.xAxis
        xAxis.position = XAxis.XAxisPosition.BOTTOM
        xAxis.setDrawGridLines(false)
        xAxis.labelCount = 4
        xAxis.granularity = 1f
        xAxis.isGranularityEnabled = true

        val xValsDateLabel = ArrayList<String>()

        val xValsOriginalMillis = ArrayList<Long>()
        xValsOriginalMillis.add(1554875423736L)
        xValsOriginalMillis.add(1555275494836L)
        xValsOriginalMillis.add(1585578525900L)
        xValsOriginalMillis.add(1596679626245L)
        xValsOriginalMillis.add(1609990727820L)

        for (i in xValsOriginalMillis.indices) {
            val mm = xValsOriginalMillis[i] / 60 % 60
            val hh = xValsOriginalMillis[i] / (60 * 60) % 24
            val mDateTime = "$hh:$mm"
            xValsDateLabel.add(mDateTime)
        }

        class MyValueFormatter(private val xValsDateLabel: ArrayList<String>) : ValueFormatter() {

            override fun getFormattedValue(value: Float): String {
                return value.toString()
            }

            override fun getAxisLabel(value: Float, axis: AxisBase): String {
                xAxis.valueFormatter = (MyValueFormatter(xValsDateLabel))
                if (value.toInt() >= 0 && value.toInt() <= xValsDateLabel.size - 1) {
                    return xValsDateLabel[value.toInt()]
                } else {
                    return ("").toString()
                }
            }
        }
    }



    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
             when (item.itemId) {
            R.id.Karta_Packenta -> {
                val intent = Intent(this, KartaPacjenta::class.java)
                startActivity(intent)
            }
            R.id.wymienniki->{
                val intent = Intent(this,Wymienniki::class.java)
                startActivity(intent)
                }
            R.id.Note->{
                val intent = Intent(this,BazaWynikow::class.java)
                startActivity(intent)
            }
                 R.id.average->{
                     val intent = Intent(this, Analiza::class.java)
                     startActivity(intent)
                 }


        }
        return super.onOptionsItemSelected(item)
    }

    override fun onNothingSelected() {
    }

    override fun onValueSelected(e: Entry?, h: Highlight?) {
    }
}

DAO

package com.example.mwproto1.ROOM

import androidx.room.*


@Dao
interface PomiarDao {

    @Insert
    suspend fun addPomiar(pomiar: Pomiar)

    @Query("SELECT * FROM pomiar ORDER BY id DESC")
    suspend fun getAllPomiar():List<Pomiar>

    @Insert
    suspend fun addMultiplePomiar(vararg pomiar: Pomiar)

    @Update
    suspend fun  updatePomiar(pomiar: Pomiar)

    @Delete
    suspend fun deletePomiar(pomiar: Pomiar )

    @Query("SELECT avg(Stezenie) FROM Pomiar ")
    suspend fun average(): Float
}

ENTITY

package com.example.mwproto1.ROOM

import android.os.Parcel
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity
data class Pomiar(
    @ColumnInfo(name="Stezenie")
    val Stezenie: String?,
    @ColumnInfo(name="Data")
    val Data: String?,
    @ColumnInfo(name="Zegar")
    val Zegar: String?,
    @ColumnInfo(name="Posilek")
    val Posilek: String?,
    @ColumnInfo(name="Samopoczucie")
    val Samopoczucie: String?,
    @ColumnInfo(name="Stres")
    val Stres: String?,
    @ColumnInfo(name="Hiperglikemia")
    val Hiperglikemia: String?

): Parcelable{
    @PrimaryKey(autoGenerate = true)
    var id :Int = 0

    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString()
    ) {
        id = parcel.readInt()
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(Stezenie)
        parcel.writeString(Data)
        parcel.writeString(Zegar)
        parcel.writeString(Posilek)
        parcel.writeString(Samopoczucie)
        parcel.writeString(Stres)
        parcel.writeString(Hiperglikemia)
        parcel.writeInt(id)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Pomiar> {
        override fun createFromParcel(parcel: Parcel): Pomiar {
            return Pomiar(parcel)
        }

        override fun newArray(size: Int): Array<Pomiar?> {
            return arrayOfNulls(size)
        }
    }
}

DATABSE

package com.example.mwproto1.ROOM

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(
    entities = arrayOf(Pomiar::class),
    version = 1
)
abstract class Database:RoomDatabase(){
    abstract fun getPomiarDao():PomiarDao

    companion object{
        @Volatile private var instance:com.example.mwproto1.ROOM.Database?=null
        private val LOCK = Any()

        operator fun invoke(context: Context)= instance?: synchronized(LOCK){
            instance ?: buildDatabase(context).also{ it ->
                instance = it
            }
        }
        private fun buildDatabase(context: Context) = Room.databaseBuilder(
            context.applicationContext,
            com.example.mwproto1.ROOM.Database::class.java,
            "pomiardatabase"
        ).build()

    }


}

Спасибо за помощь.

...