4

我目前正在创建一个使用预打包数据库的 Android 应用程序。该数据库最初大小约为 40MB,存储在 assets/databases 文件夹中。

问题
当我查看我的应用程序正在使用多少空间时,“应用程序信息”页面显示以下内容:

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


这是我所看到的截图

我认为 ROOM 造成这种情况的原因如下:

  1. 我没有在我的应用程序中缓存任何内容(使用设备文件资源管理器进行了双重检查)。
  2. 当我从 SQLiteOpenHelper 迁移到 Room 时,这个问题开始发生
  3. 数据库的大小比App Size大得多,但它与Cache大小大致相同,因此存储为Cache的任何内容都必须与数据库相关。
  4. 每当我从我的实体中添加/删除索引时,缓存大小都会发生变化。
  5. 当我清除缓存并打开应用程序时,缓存大小恢复到 ~45mb。

Android ROOM 将预打包的数据库存储为Cache是否正常?任何帮助将不胜感激,如果您需要更多信息,请告诉我。

谢谢

编辑(附加信息)
这是我在设备文件资源管理器中看到的

设备文件资源管理器

这就是我实现 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;
    }
}
4

1 回答 1

2

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

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

很可能是后者。

不同之处在于,在日志模式下,会保留对数据库所做更改的日志,因此当应用更改并需要新页面时,数据库会增长。而在 WAL 模式下,更改将应用​​于 -wal 文件,然后在点 (CHECKPOINT) 处将更改应用于数据库文件。因此,在发生 CHECKPOINT 之前,所有更改都存储在 -wal 文件中。

例如 在此处输入图像描述 在此处输入图像描述

切换到 inMemory 数据库(没有其他更改,因此插入完全相同的数据)然后:-

在此处输入图像描述

  • 通过设备文件资源管理器 在此处输入图像描述
  • 通过 App Inspection(又名 Database Inspector)

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

于 2021-11-03T21:45:26.573 回答