Модель MVVM - я не могу найти ошибку, которая мешает созданию ViewModel - PullRequest
0 голосов
/ 11 февраля 2020

У меня проблема с View Model. В упражнении «Анализ» мне пришлось что-то сломать в коде, и я не могу найти ошибку. Может ли кто-нибудь помочь мне. Я новичок ie в программе Android и часто делаю глупые ошибки. Я постараюсь найти ошибку к тому времени. Большое спасибо за вашу помощь. С уважением, пакет

DAO com.example.mwproto1.ROOM

import androidx.lifecycle.LiveData 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 ")
     fun average(): LiveData<Float>
}

REPOSITORY

package com.example.mwproto1.ROOM

import android.app.Application
import androidx.lifecycle.LiveData
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async

class Repository(application: Application) {


    private  var pomiardao: PomiarDao

    init {
        val database = Database
            .buildDatabase(application.applicationContext)
        pomiardao = database.getPomiarDao()

    }


    fun averageasync(): Deferred<LiveData<Float>> =
        CoroutineScope(Dispatchers.IO).async {
            pomiardao.average()
        }

}

ViewModel

package com.example.mwproto1.ViewModel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import com.example.mwproto1.ROOM.Pomiar
import com.example.mwproto1.ROOM.Repository
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.runBlocking

class ViewModel(application: Application):AndroidViewModel(application) {

    private var PomiarRepository: Repository = Repository(application)

    private var allpomiar: Deferred<LiveData<Float>> =
        PomiarRepository.averageasync()


    fun AverageVM(): LiveData<Float> = runBlocking {
        allpomiar.await()
    }
}

Сущность

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

АНАЛИЗ-АКТИВНОСТЬ

package com.example.mwproto1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.example.mwproto1.ROOM.Pomiar
import com.example.mwproto1.UI.PomiarAdapter
import kotlinx.android.synthetic.main.activity_analiza.*
import kotlin.properties.Delegates

public class Analiza : AppCompatActivity() {

    private lateinit var textView: TextView
    private lateinit var viewModel: ViewModel
    private lateinit var daoAdapter:PomiarAdapter
    private lateinit var pomiar: LiveData<Float>

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

        viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(application)
            .create(ViewModel::class.java)

        textView = findViewById(R.id.TV7)



        pomiar.observe(this,Observer {
            textView.setText(it.toString()) })
    }
}

ОШИБКА

E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.mwproto1, PID: 11239 java .lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.example.mwproto1 / com.example.mwproto1.Analiza}: kotlin .UninitializedPropertyAccessException: значение свойства lateinit не было инициализировано в android .app.ActivityThread.performLaunchActivity (ActivityThread. java: 3270) в android .app.ActivityThread.handleLaunchActivity (ActivityThread. java: 09) в android .app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem. java: 83) в android .app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor. java: 135) в android .app.servertransactio n.TransactionExecutor.execute (TransactionExecutor. java: 95) в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 2016) в android .os.Handler.dispatchMessage (Обработчик. * 1042) *: 107) в android .os.Looper.l oop (Looper. java: 214) в android .app.ActivityThread.main (ActivityThread. java: 7356) в java. lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 492) в com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 930) Причина: kotlin .UninitializedPropertyAccessException: pomiar свойства lateinit не был инициализирован в com.example.mwproto1.Analiza.onCreate (Analiza.kt: 34) в android .app.Activity .performCreate (Activity. java: 7802) в android .app.Activity.performCreate (Activity. java: 7791) в android .app.Instrumentation.callActivityOnCreate (Instrumentation. java: 1299) в android .app.ActivityThread.performLaunchActivity (ActivityThread. java: 3245) в android .app.ActivityThread.handleLaunchActivity (Activity Thread. java: 3409) в android .app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem. java: 83) в android .app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor. java: 135) в android .app.servertransaction.TransactionExecutor.execute (TransactionExecutor. java: 95) в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 2016) в android .os.Handler .dispatchMessage (Обработчик. java: 107) в android .os.Looper.l oop (Looper. java: 214) в android .app.ActivityThread.main (ActivityThread. java: 7356) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 492) в com. android. internal.os.ZygoteInit.main (ZygoteInit. java: 930) I / Процесс: отправка сигнала. PID: 11239 SIG: 9 Отключен от целевой виртуальной машины, адрес: «localhost: 8603», транспорт: «socket»

1 Ответ

0 голосов
/ 11 февраля 2020

Как и в сообщении об ошибке: «свойство pomiar lateinit не было инициализировано»

Возможно, вы захотите добавить: pomiar = viewModel.AverageVM () после инициализации viewModel в ANALIZA-ACTIVITY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...