android-room 相关问题

有关Android Room Persistence Library(Android架构组件的一部分)的相关问题

在Android中,当应用程序处于后台时无法将推送通知数据保存到Room

从后端发送自定义推送通知。有效负载如下 有效载荷 { “数据”: { “通知”: { "title": "কথা চলুক সেরা অফারে...

回答 2 投票 0

使用房间查询过滤掉多个项目?

我无法获取房间查询以允许对我的数据库进行多个通配符查询。 @询问 ( ”“” 从运动中选择 * WHERE 帐户 ID = : 帐户 ID ...

回答 1 投票 0

测试ksp生成的内部类

我们最近将房间从 KAPT 迁移到了 KSP。 当 kotlin 代码生成设置打开时 扩展.配置 { arg("room.generateKotlin", "true") }

回答 1 投票 0

执行更新时如何从 Room 传播更改?

我的房间中有 7 个项目,我想更新其中一个项目的名称。这是我尝试过的: 接口 ItemDao { @Query("从item_table中选择*") 有趣的 getItems():流程 我的房间中有 7 件物品,我想更新其中一件物品的名称。这是我尝试过的: interface ItemDao { @Query("SELECT * FROM item_table") fun getItems(): Flow<List<Item>> @Update fun updateItem(item: Item) } 我的仓库非常简单: interface ItemRepository { fun getItems(): Flow<List<Item>> fun updateItem(item: Item) } 在 ViewModel 中我有: class ItemsViewModel @Inject constructor( private val repo: ItemRepository ) : ViewModel() { val itemsResultFlow = flow { repo.getItems().collect { items -> try { emit(Result.Success(items)) } catch (e: Exception) { emit(Result.Failure(e)) } } } var updateItemResult by mutableStateOf<Result<Unit>>(Result.Loading) private set fun updateItem(item: Item) = viewModelScope.launch { updateItemResult = try { Result.Success(repo.updateItem(item)) } catch (e: Exception) { Result.Failure(e) } } } 在可组合项中我有: val itemsResponse by viewModel.itemsResultFlow.collectAsStateWithLifecycle(Result.Loading) Scaffold( topBar = { // }, content = { when(val itemsResponse = itemsResponse) { is Result.Loading -> CircularProgressIndicator() is Result.Success -> { items( items = itemsResponse.data ) { item -> Text(item.name) } } is Result.Error -> print(result.e) } } ) 该应用程序工作正常,但每次我更新单个项目时,它都会加载整个项目列表,这不是我想要的。为了摆脱这个问题,我在 ViewModel 中做了一些更改: private var _items = MutableStateFlow<Result<List<Item>>>(Result.Loading) val items: StateFlow<Result<List<Item>>> = _items.asStateFlow() init { viewModelScope.launch { repo.getItems().collect { items -> try { _items.value = Response.Success(items) } catch (e: Exception) { _items.value = Response.Failure(e) } } } } 在可组合项内部: val itemsResponse by viewModel.items.collectAsState() 应用程序编译时没有任何错误,但是当我更新项目名称时,我无法在列表中看到更新的名称,除非我关闭并重新打开应用程序。如何在不需要加载整个项目列表的情况下查看列表中更新的值? [...] 每次我更新单个项目时,它都会加载整个项目列表,这不是我想要的。 我注意到您不希望这样做的原因,但一般来说,您应该让数据库优化如何在发生变化时更新流程。仅当您存在明显的性能问题时,您才应该重构您的应用程序来解决此问题。 一种方法是从 DAO 中删除流,这样列表就不会再自动更新。然后,每当发生更改时,您就需要自己进行更新。确保将此逻辑封装在存储库中,以便应用程序的其余部分仍然只有一个单一事实来源(即存储库应该still发出一个Flow<List<Item>>,它只需要在项目出现时自行构造列表)已更改)。 如果您的问题是由成千上万个项目的非常大的列表引起的(这可能不是因为您说您只有 7 个,但尽管如此......)并且您无法在 DAO 中使用 WHERE 子句来限制它们,那么正确的方法是使用分页库。在这种情况下,数据库将仅返回分块数据,从而有效地提供多个子列表。当某个项目发生更改时,只会再次检索包含该项目的子列表。 您提出的解决方案无法解决问题,因为它仍然收集getItems()流。因此,无论代码的其余部分做什么,当单个项目发生更改时,您已经得到了一个全新的列表(再次强调一下,这通常不是问题)。 最后一点,请不要在视图模型中使用 MutableState,在一些令人讨厌的边缘情况下,这将无法按预期工作。如果您想保持相同的功能,可以将其替换为 MutableStateFlow。

回答 1 投票 0

如何优化 TypeConverter BoilerPlate 代码

我有一个数据类,其 val 类型为“另一个数据类的列表”。 我创建了一个转换器类。但这会创建样板文件,因为如果我们有

回答 1 投票 0

在某些 api 级别使用 Room 时出现空 SQLiteException

我在加载应用程序时收到此错误: 2024-10-29 13:29:19.532 3647-3854 SQLiteLog org.druidanet.druidnet E (1) 2024-10-29 13:29:19.727 3647-3647 AndroidRunti...

回答 1 投票 0

如果 2 个组合列不存在,则初始化房间数据库

我有一张带有一些列的房间表。 现在我想添加另一列。但仅当“年”和“周”的组合不存在时才应添加。否则应该被忽略。 @插入(

回答 2 投票 0

如何获取 Room 数据库的上下文并在 Android Compose 中正确初始化它?

我在Android应用程序中使用Room数据库,需要上下文类的实例来创建它。我想访问 ViewModel 中的数据库,但只能在可组合项或活动中获取上下文,s...

回答 1 投票 0

自定义对象列表的房间类型转换器失败

我有一个自定义对象列表,但 TypeConverters 没有按我的预期工作。 方法抛出“com.google.gson.JsonSyntaxException”异常。 java.lang.IllegalStateException:预期 BEGIN_O...

回答 1 投票 0

Android Room 中的@Transaction 似乎没有按预期工作

在下面的代码中,Flow似乎是在deleteAll和insertAll之间发出的。我希望将这些方法作为一个事务一起执行。我错过了什么吗? 私有常量值

回答 1 投票 0

拍照时出现TransactionTooLargeException

当我创建启动相机应用程序来拍照的意图时,我的应用程序遇到问题,我的应用程序崩溃并收到以下错误: 2021-06-11 18:07:46.914 7506-7506/com.package.ap...

回答 2 投票 0

如何修复动态更新时RecycleView输出错误

我正在学习android开发,我编写了一个任务调度程序应用程序。我有一个侧边栏,其中的日期至少有 1 个任务。主要活动有一个回收视图,其中显示任务机器人...

回答 1 投票 0

Kotlin 中如何让 uiState 的参数在转动屏幕时保持不变?

我制作了一个可以创建或编辑卡片的表单。我正在使用 Kotlin + Jetpack Compose + Dagger Hilt + Room。它工作正常,除了一件事。当我转动屏幕而不保存记录时,我...

回答 1 投票 0

如何根据房间数据库中另一个表的数据计算一个表的行数

假设有一家餐厅,其表格如下 - @Entity(表名 = "披萨销售") 数据类披萨( 有效的, 值名称, 价值价格, 已售数量, 有效日期, ) //披萨

回答 1 投票 0

无法更新基本文本字段的值

我正在构建一个使用基本文本字段的应用程序。当我尝试更新基本文本字段的值时,除非您重新组合它,否则它将无法工作。 val textX = 记住{ mutableStateOf("Text")}

回答 1 投票 0

干净的架构:无法将 PagingSource<Int, Entities> 映射到 PagingSource<RepositoryModel>

我的要求是使用干净的架构和离线支持在页面中显示注释。 我正在使用 Paging 库进行分页。下面是

回答 1 投票 0

房间更新时如何获取新的物品名称?

我的房间中有 5 个项目,我想更新其中一个项目的名称。这是我尝试过的: 接口 ItemDao { @Query("从item_table中选择*") 有趣的 getItems():流程 我的房间中有 5 件物品,我想更新其中一件物品的名称。这是我尝试过的: interface ItemDao { @Query("SELECT * FROM item_table") fun getItems(): Flow<List<Item>> @Update fun updateItem(item: Item) } 我的仓库非常简单: interface ItemRepository { fun getItems(): Flow<List<Item>> fun updateItem(item: Item) } 在 ViewModel 中我做: class ItemsViewModel @Inject constructor( private val repo: ItemRepository ) : ViewModel() { private val _result = MutableStateFlow<Result>(Result.Loading) val result: StateFlow<Result> = _result .onStart { getItems() }.stateIn( viewModelScope, SharingStarted.WhileSubscribed(5_000L), Result.Loading ) private fun getItems() = viewModelScope.launch { try { repo.getItems().collect { items -> _result.value = Result.Success(items) } } catch (e: Exception) { _result.value = Result.Error(e) } } 在可组合项中我所做的: val result = viewModel.result.collectAsStateWithLifecycle().value Scaffold( topBar = { // }, content = { when(result) { is Result.Loading -> CircularProgressIndicator() is Result.Success -> { items( items = result.items ) { item -> Text(item.name) } } is Result.Error -> print(result.e) } } ) 当我打开应用程序时,我可以正确地从 Room 获取所有数据。当我更新第一个项目的名称时,我看不到更新的名称,除非我关闭并重新打开应用程序。为什么当我更新 Room 中的名称时状态没有改变?怎么解决这个问题? 我什至不确定你的ViewModel到底发生了什么,但有一种既定的方法可以实现这一点。 使用 Flow<List<Item>> 将 Flow<Result> 转换为 map 使用 catch 捕获异常并发出包含在 Result.Error 中的捕获错误 使用 Flow<Result> 将 StateFlow<Result> 转换为 stateIn val result: StateFlow<Result> = repo.getItems() .map { items -> Result.Success(items) as Result } // .map<List<Item>, Result> { Result.Success(it) } // alternative map syntax .catch { e -> emit(Result.Error(e as Exception)) } .stateIn( viewModelScope, SharingStarted.WhileSubscribed(5_000L), Result.Loading ) 您还可以使用 combine 组合多个流程,如 docs 中所述。

回答 1 投票 0

如何使用多个数据库实例更新房间流量?

我正在尝试实时计算一些值,当我在数据库中插入内容并使用 getCount() 获取它时,它会很好地返回它,但我想实时更新 Bar 中的文本。应用程序重新启动后会更新,但不会更新...

回答 3 投票 0

在Android Room中查询日期

我有一个表todo_db,其中包含一列 dueDate,我想运行一个查询来选择所有 dueDate 类似于给定日期的位置。 我在 Dao 中写了这个查询 @Query("SELECT * FROM todo_db WHERE du...

回答 2 投票 0

Android Room崩溃无法在事务内启动事务

我的 Android 应用程序中有一个房间数据库。 最近的一项更改导致了崩溃: 致命异常:android.database.sqlite.SQLiteException:无法在事务内启动事务(代码 1

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.