[英]How do I get Room database size
我想在我的 android 应用程序中监控我的 Room 数据库的大小。 我已经搜索了一段时间,发现关于如何做到这一点的信息很少。 是否有任何 Room (SQLite) 命令来确定数据库大小?
过了一会儿,四处搜索,我发现了一些我测试过的“旧”(又名古老)编译指示调用,并且它以某种方式工作。 不需要获得确切的值,而是使用的提示。
您可以像这样在 Room 中执行 @Dao @Query:
@Dao
interface SystemDao{
@Query("""
SELECT s.*, c.*
FROM pragma_page_size as s
JOIN pragma_page_count as c
""")
suspend fun getDatabaseSizeInfo():List<SystemDatabaseSizeInfo>
}
在数据 class "pojo" 中,您定义:
data class SystemDatabaseSizeInfo(
var page_size:Int?=null,
var page_count:Int?=null
)
由于 pragma 查询的结果是 page_size 和 page_count。 这些以后可以成倍增加,或单独呈现。
您可以在此处阅读有关 SQLite 编译指示调用的信息: https://www.sqlite.org/pragma.C9536FDCZ8AD2FC25
还有许多其他实用程序查询可能有用,但您应该谨慎使用它们,因为其中一些可能会破坏 SQLite 数据库的稳定性。
Android IDE/lint 可能会导致这些命令无效(红色),但如果您有 AS4.1Cx (C6+),您可以在 Database Inspector 工具中运行其中一些命令以查看它们是否有效。 我在这里提交了一个 issuetracker 事件: https://issuetracker.google.com/157374656
感谢所有回答的人,您通过密集的谷歌搜索引导我走向正确的道路......
没试过,但应该是这样的:
fun getSize(context: Context, fileName: String) : Long {
val file = context.getDatabasePath(fileName)
return file.length()
}
正如@Commonsware 所建议的那样,除非已提交预写日志,否则它可能不准确(这是同一目录中的这些*.wal
文件)。 并且不能只是将大小相加,而是必须检查数据库文件当前是否正在使用,如果是,请先关闭它。 另一种选择是.disableWriteAheadLogging()
,这是以牺牲一些性能为代价的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.