android - Android Room 将预打包的数据库存储在缓存中是否正常?

标签 android caching android-room android-database android-room-prepackageddatabase

我目前正在创建一个使用预打包数据库的 Android 应用程序。该数据库最初大小约为 40MB,存储在 assets/databases 文件夹中。
问题
当我查看我的应用程序正在使用多少空间时,“应用程序信息”页面显示以下内容:

  • 应用程序大小:~25mb
  • 用户数据:~3mb
  • 缓存:~45mb

  • Here is a screenshot of what I'm seeing
    我认为 ROOM 造成这种情况的原因如下:
  • 我没有在我的应用程序中缓存任何内容(使用设备文件资源管理器进行了双重检查)。
  • 当我从 SQLiteOpenHelper 迁移到 Room
  • 时,这个问题开始发生
  • 数据库的大小远大于 App Size,但它与 Cache 大小大致相同,因此作为 Cache 存储的任何内容都必须与数据库相关。
  • 每当我从我的实体中添加/删除索引时,缓存大小都会发生变化。
  • 当我清除缓存并打开应用程序时,缓存大小恢复到 ~45mb。

  • Android ROOM 将预打包的数据库存储为 Cache 是否正常? 任何帮助将不胜感激,如果您需要更多信息,请告诉我。
    谢谢
    编辑(附加信息)
    这是我在设备文件资源管理器中看到的
    Device File Explorer
    这就是我实现 Room 数据库的方式
    @Database(entities = {/* entities*/}, version = 1, exportSchema = false)
    public abstract class MyDatabase extends RoomDatabase {
        public abstract MyDao myDao();
        private static volatile Database INSTANCE;
    
        public static Database getDatabase(final Context context) {
            if (INSTANCE == null) {
                synchronized (MyDatabase.class) {
                    if (INSTANCE == null) {
                        INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            MyDatabase.class, "database")
                            .createFromAsset("databases/database.db")
                            .build();
                    }
                }
            }
    
            return INSTANCE;
        }
    }
    

    最佳答案

    我相信您遇到的情况可能是由于以下任一原因:

  • 您使用 inMemoryDatabaseBuilder
  • 由于 Room 默认使用 WAL(预写日志),而您之前使用的是日志模式,您会感到困惑。

  • 很可能是后者。
    不同之处在于,在日志模式下,会保留对数据库所做更改的日志,因此当应用更改并需要新页面时,数据库会增长。而在 WAL 模式下,更改将应用​​于 -wal 文件,然后在点 (CHECKPOINT) 处将更改应用于数据库文件。因此,在发生 CHECKPOINT 之前,所有更改都存储在 -wal 文件中。
    例如
    enter image description here
    enter image description here
  • -shm 文件是 WAL 文件的 WAL 文件
  • 或许引用https://sqlite.org/wal.html

  • 切换到 inMemory 数据库(没有其他更改,因此插入完全相同的数据)然后:-
    enter image description here
  • 通过设备文件资源管理器
    enter image description here
  • 通过应用检查(又名数据库检查员)

  • 所以我怀疑 -wal 文件被视为缓存。

    关于android - Android Room 将预打包的数据库存储在缓存中是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69826326/

    相关文章:

    java - Android 自定义 ListView 适配器中的 ArrayList 索引越界异常

    php - 在 Laravel 中 artisan config :cache actually cache the config as specified in the cache. php 设置?

    Android 房间数据库没有立即在数据库中插入数据

    reactjs - React & Service Worker - 缓存内容 - 通知用户

    language-agnostic - 内存缓存过期时间

    android - 我的应用重启后房间数据丢失

    Android Room defaultValue ="CURRENT_TIMESTAMP"不起作用

    android - Cordova 应用程序突然无法正常工作

    javascript - XMLHttpRequest 无法加载 http ://localhost:8088/web/webclient/version_info error in ionic login to odoo server

    java - 当实际值可能为 0 时检查未初始化的 int?