Вот полная ошибка: < /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
«java.lang.illegalstateException: Требуемая стоимость была нулевой.» При добавлении дочернего сущности ⇐ Android
Форум для тех, кто программирует под Android
1751593404
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()
)
Подробнее здесь: [url]https://stackoverflow.com/questions/79689211/java-lang-illegalstateexception-required-value-was-null-when-adding-a-child[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия