我想使用
Room
存储用户在 SQLite 表中执行的最后 5 次搜索。当条目超过 5 个时,如何才能始终删除最旧的条目?
我可以使用
rowid
吗?那么检查表中的条目数是否大于5,然后按rowid
升序排序并删除第一个条目?还有其他想法吗?
我不想使用自动增量 id 列,因为理论上是这样 限制在某个给定的最大值,ID 可以是
在这一逻辑上,根本不应该在数据库中使用自动增量值。我怀疑您是否真的拥有这样的数据,即
Long
及其最大值(9223372036854775807)还不够或无法实现。
好吧,作为另一种选择 - 如果表中有 5 行并且您有 int
id
字段,则可以使用下一个架构,例如:
0
)id
减少 1。@Query("update search_table set id = id - 1")
fun reorderData()
这是我如何实现类似案例的。
在我的用例中,我的表格中有一个
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>
}