«java.lang.illegalstateException: Требуемая стоимость была нулевой.» При добавлении дочернего сущностиAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 «java.lang.illegalstateException: Требуемая стоимость была нулевой.» При добавлении дочернего сущности

Сообщение Anonymous »

Вот полная ошибка: < /p>
FATAL EXCEPTION: DefaultDispatcher-worker-3
Process: com.apps.irlleveler, PID: 15274
java.lang.IllegalStateException: Required value was null.
at com.apps.irlleveler.data.db.UserDao_Impl.__fetchRelationshipStatAscomAppsIrllevelerDataStatWithTasks(UserDao_Impl.kt:273)
at com.apps.irlleveler.data.db.UserDao_Impl.getUserWithStatsWithTasks$lambda$1(UserDao_Impl.kt:83)
at com.apps.irlleveler.data.db.UserDao_Impl.$r8$lambda$f2zhaSZJKsl9DSGFGRABt37Yfa0(Unknown Source:0)
at com.apps.irlleveler.data.db.UserDao_Impl$$ExternalSyntheticLambda2.invoke(D8$$SyntheticClass:0)
at androidx.room.util.DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1.invokeSuspend(DBUtil.kt:68)
at androidx.room.util.DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1.invoke(Unknown Source:8)
at androidx.room.util.DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1.invoke(Unknown Source:4)
at androidx.room.driver.SupportSQLiteConnectionPool.useConnection(SupportSQLiteConnectionPool.android.kt:42)
at androidx.room.RoomConnectionManager.useConnection(RoomConnectionManager.android.kt:126)
at androidx.room.RoomDatabase.useConnection$room_runtime_release(RoomDatabase.android.kt:593)
at androidx.room.util.DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1.invokeSuspend(DBUtil.android.kt:113)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@79f54d6, Dispatchers.IO]
< /code>
Мое приложение имеет пользователя с несколькими статистиками. Эта ошибка иногда (относительно редко и, казалось бы, случайно) появляется, когда я пытаюсь добавить новую статистику.@TypeConverters(value = [MyConverters::class])
@Database(entities = [User::class, Task::class, Stat::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun getUserDao(): UserDao
abstract fun getStatDao(): StatDao
abstract fun getTaskDao(): TaskDao

companion object {
const val NAME = "App_DB"
private var instance: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
if (instance==null) {
instance = Room.databaseBuilder(
context,AppDatabase::class.java, NAME
)
.allowMainThreadQueries()
.addCallback(object : RoomDatabase.Callback() {
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
db.execSQL("PRAGMA foreign_keys=ON")
}
})
.build()
}
return instance as AppDatabase
}
}

}
< /code>
my daos: < /p>
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User): Long

@Query("SELECT * FROM user WHERE id = 0")
fun getUserWithStatsWithTasks(): Flow
}

@Dao
interface StatDao {
@Query("SELECT * FROM STAT")
fun getAllStats() : List

@Query("SELECT * FROM STAT")
fun getAllStatsWithTasks() : List

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertStat(stat: Stat): Long

@Delete
fun deоleteStat(stat: Stat)
}
< /code>
my viewmodels: < /p>
class UserViewModel(private val repository: UserRepository) : ViewModel() {
val userDao = MainApplication.appDatabase.getUserDao()
val statDao = MainApplication.appDatabase.getStatDao()
val taskDao = MainApplication.appDatabase.getTaskDao()

private val _uiUser = MutableStateFlow(null)
val uiUser: StateFlow = _uiUser

init {
loadUser()
}

private fun loadUser() {
viewModelScope.launch(Dispatchers.IO) {
var user = userDao.getUserWithStatsWithTasks()

if (user.first()?.user == null) {
//new user
val newUser = User(username = "Player")
val userId = userDao.insertUser(newUser)

val newUWSWT = userDao.getUserWithStatsWithTasks()
user = newUWSWT
}
_uiUser.value = user.first()?.toUIModel()
}
}

fun reloadUser() {
viewModelScope.launch(Dispatchers.IO) {
val user = userDao.getUserWithStatsWithTasks().first()
Log.d("db user reload", "${user}")
_uiUser.value = user?.toUIModel()
}
}

fun updateUser(user: User) {
viewModelScope.launch(Dispatchers.IO) {
userDao.insertUser(user)
reloadUser()
}
}

}

class StatViewModel: ViewModel() {
val statDao = MainApplication.appDatabase.getStatDao()

fun insertStat(stat: Stat){
viewModelScope.launch(Dispatchers.IO) {
statDao.insertStat(stat)
}
}

fun deleteStat(stat: Stat){
viewModelScope.launch(Dispatchers.IO) {
statDao.deleteStat(stat)
}
}
}
< /code>
и, наконец, сами классы: < /p>
@Entity
data class User(
@PrimaryKey val id: Int = 0,
@ColumnInfo val username: String = "",
@ColumnInfo val level: Int = 1,
@ColumnInfo val coins: Int = 0,
@ColumnInfo val xp: Int = 0
)

data class UserWithStatsWithTheStatsTasks(
@Embedded
val user: User,
@Relation(
entity = Stat::class,
parentColumn = "id",
entityColumn = "owningUserId"
)
val statsWithTasks: List
)

@Entity
class Stat (
@PrimaryKey(autoGenerate = true) val id: Int = 0,
@ColumnInfo val name: String,
@ColumnInfo val description: String = "",
@ColumnInfo val owner: User,
@ColumnInfo val level: Int = 1,
@ColumnInfo val totalXP: Int = 0,
@ColumnInfo val currentXP: Int = 0,
@ColumnInfo val neededXP: Int = 1,
val owningUserId: Long = owner.id.toLong()
)


Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-a-child
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»