表中最多保留 5 行(Room/Sqlite)

问题描述 投票:0回答:2

我想使用

Room
存储用户在 SQLite 表中执行的最后 5 次搜索。当条目超过 5 个时,如何才能始终删除最旧的条目?

  • 我不想添加日期列并按日期排序,出于隐私原因,我不想存储用户执行搜索的时间
  • 我不想使用自动增量 id 列,因为理论上它限制在某个给定的 ID 最大值

我可以使用

rowid
吗?那么检查表中的条目数是否大于5,然后按
rowid
升序排序并删除第一个条目?还有其他想法吗?

sqlite android-room
2个回答
0
投票

我不想使用自动增量 id 列,因为理论上是这样 限制在某个给定的最大值,ID 可以是

在这一逻辑上,根本不应该在数据库中使用自动增量值。我怀疑您是否真的拥有这样的数据,即

Long
及其最大值(9223372036854775807)还不够或无法实现。

好吧,作为另一种选择 - 如果表中有 5 行并且您有 int

id
字段,则可以使用下一个架构,例如:

  1. 删除具有最小 id 的行(我猜它会是
    0
  2. 使用一个查询更新所有行,将其
    id
    减少 1。
@Query("update search_table set id = id - 1")
fun reorderData()
  1. 插入新行。

0
投票

这是我如何实现类似案例的。

在我的用例中,我的表格中有一个

timestamp
字段。我用它来排序搜索建议。您可以使用其他字段应用相同的逻辑,例如自动递增的主字段。

因此,在我的

Dao
中,我创建了一个
@Transaction
,并在其中插入后删除了过期的行。

abstract class SearchSuggestionsDao {
    @Transaction
    open fun addSearchSuggestionWithLimit(
        searchSuggestion: SearchSuggestion,
        maxRecordsToKeep: Int = MAX_SUGGESTIONS_RECORDS_TO_KEEP,
    ) {
        addSearchSuggestion(searchSuggestion)
        maintainMaxRecordsOf(maxRecordsToKeep)
    }

    fun maintainMaxRecordsOf(
        maxRecordsToKeep: Int,
    ) {
        val allSuggestions = searchSuggestionsSortedByTimeStampDescending()

        if (allSuggestions.size > maxRecordsToKeep) {
            val expiredSuggestions = allSuggestions.subList(maxRecordsToKeep, allSuggestions.size)
            deleteSearchSuggestions(expiredSuggestions)
        }
    }

    @Delete
    abstract fun deleteSearchSuggestions(
        searchSuggestions: List<SearchSuggestion>,
    )

    @Query("SELECT * FROM search_suggestions ORDER BY timeStamp DESC")
    abstract fun searchSuggestionsSortedByTimeStampDescending(): List<SearchSuggestion>
}
© www.soinside.com 2019 - 2024. All rights reserved.