【发布时间】:2020-05-26 07:19:58
【问题描述】:
我对视图模型有疑问。在活动“分析”中,我不得不破坏代码中的某些内容,但找不到错误。有人可以帮助我。我是Android程序的新手,我经常犯愚蠢的错误。到那时我会尝试找出错误。 非常感谢你的帮助 问候
DAO 包 com.example.mwproto1.ROOM
导入 androidx.lifecycle.LiveData 导入 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>
}
存储库
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()
}
}
视图模型
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)
}
}
}
ANALIZA-活动
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: 致命异常: main 进程:com.example.mwproto1,PID:11239 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.mwproto1/com.example.mwproto1.Analiza}: kotlin.UninitializedPropertyAccessException:lateinit 属性 pomiar 尚未初始化 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.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(Handler.java:107) 在 android.os.Looper.loop(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:lateinit 属性 pomiar 尚未初始化 在 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(ActivityThread.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(Handler.java:107) 在 android.os.Looper.loop(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/Process:发送信号。 PID:11239 SIG:9 断开连接 目标虚拟机,地址:'localhost:8603',传输:'socket'
【问题讨论】:
-
新错误,老我有空
-
发布您的 viewModelFactory 代码并将您的 viewModel 类名重命名为 SharedViewModel 之类的其他名称,切勿将您的自定义类命名为现有类,这不是一个好习惯
标签: android database android-studio kotlin mvvm