Room数据库中如何获取指定名称表(实体)的存储大小
Room 获取单张表独立存储大小的实现方案
Room基于原生SQLite封装,没有专门的单表大小查询API,直接通过原生SQL查询即可实现,不需要遍历表内数据做逻辑计算。
具体实现步骤
- 依托Android系统自带SQLite内置的dbstat虚拟表完成统计,该扩展已默认加载可直接使用
- 在你现有的
ImageDataDao中新增对应方法,原有业务逻辑完全不需要改动:
@Dao interface ImageDataDao { // 原有业务方法保持不变 @Query("SELECT * FROM localimagedata order by image_name limit 1") fun getFirst(): LiveData<LocalImageData> @Query("SELECT * FROM localimagedata order by image_name limit 10") fun getFirstTen(): List<LocalImageData> // 新增:触发SQLite重新收集表的存储统计信息 @Query("ANALYZE") suspend fun refreshTableStorageStats() // 新增:查询localimagedata表的真实磁盘占用大小,单位为字节 @Query("SELECT SUM(pgsize) FROM dbstat WHERE name = 'localimagedata'") fun getLocalImageDataTableSize(): Long? }
注意事项
- 查询返回的是表的真实磁盘占用大小,单位为字节,可通过除以1024/1024换算为KB/MB单位
- 表内数据发生增删改操作后,原有统计信息会失效,需要重新调用
refreshTableStorageStats()执行ANALYZE命令,才能拿到和当前数据匹配的准确大小 - 上述查询拿到的是表本身的磁盘占用,如果需要把关联的索引占用空间一并计算,把查询的WHERE条件修改为
WHERE name LIKE 'localimagedata%'即可,SQLite默认会给表的索引用「表名_索引名」的规则命名 - 若执行查询时提示dbstat表不存在,可在数据库初始化完成后手动执行一句
CREATE VIRTUAL TABLE IF NOT EXISTS dbstat USING dbstat();加载虚拟表 - 不要采用遍历全表累加单行数据长度的方式计算大小,该方式得到的是数据逻辑大小,和实际磁盘占用(含页对齐、空闲页开销)的差值会很大
内容的提问来源于stack exchange,提问作者Ashutosh Soni
相关产品推荐
相关产品推荐

