【问题标题】:How does saving and loading data into a Room database work?将数据保存和加载到 Room 数据库是如何工作的?
【发布时间】:2021-06-19 19:59:07
【问题描述】:

我知道我们可以预先填充 Room 数据库 (https://developer.android.com/training/data-storage/room/prepopulate),但我首先很难获得一个概念模型,说明数据在应用程序生命周期中的存储方式、时间和位置.

我假设在某些时候,数据库被保存为一个文件,然后可以在应用程序重新启动时用于重新填充 Room 实例,但我不清楚这个文件是如何保存的,或者何时以及是否这是一个手动或自动过程(或两者兼而有之!)。

是否有简明的解释或图表来理解这个过程在高层次上是如何工作的?

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    如果事务确实更新了数据库,则在事务发生时保存数据。每当执行 SQL 语句时,默认情况下都会有一个事务。

    但是,可以通过发出BEGIN TRANSACTION 后跟语句,然后发出COMMIT TRANSACTIONEND TRANSACTION(如果认为执行成功)来对语句进行分组,然后更新文件。

    如果认为执行不成功,则可以发出ROLLBACK TRANACTION,在这种情况下,更改将被撤消并回滚。

    以上是根据 SQLite。 Room 是 SQLite 的包装器,它提供 @Transaction 注释并通过 Room 数据库访问 beginTransactionsetTransactionSuccessfulendTransaction 方法以及另外的 runInTransaction 方法(不推荐使用 begin/setSuccessful 和 end)。还有inTransaction方法。

    您还可以使用 SupportSQLiteDatabase(可通过 RoomDatabase 的 getOpenHelper 方法直接发出 SQL 语句来开始和结束事务)。

    数据库主要是一个包含 1 或 2 个用于记录和回滚的支持文件的文件。在android上默认文件(根据传递给databaseBuilder的第三个参数的名称命名)。

    默认情况下,文件将位于 data/data//databases 文件夹中

    • 依赖于应用程序

    如果日志模式为JOURNAL 数据库文件和日志文件(数据库文件后缀为-journal)会有1-2个文件。

    • 在日志模式下,更新被写入数据库和日志,允许回滚更新。

    如果日志记录模式是 WAL(预写日志记录),这是 Room 默认使用的,则将有 1-3 个文件。数据库文件、wal文件(后缀-wal的数据库文件)和共享内存文件(后缀-shm的数据库文件)。

    • WAL 更新被写入-wal 文件(并可能写入-shm,它是-wal 文件的索引文件)。 -wal 文件(如果不为空)是数据库的一部分。检查点将 -wal 文件应用于数据库,通常在 SQLite 认为它适合或数据库关闭时进行。回滚会有效地从 -wal 文件中删除数据。

    简而言之,文件的创建、更改或保存对应用程序开发人员来说通常并不重要,因为 SQLite 会管理这一切。

    从 Room(以及非 Room)的角度来看,只有在第一次尝试访问数据库时才会创建数据库文件。对于预填充的数据库,如果 APK(通常是资产文件夹或子文件夹)在尝试访问数据库之前如果数据库文件不存在,则需要从其位置复制文件。 Room 提供 RoomBuilder createFrom???? 方法在数据库文件不存在时执行复制。

    是否有简明的解释或图表来理解这个过程在高层次上是如何工作的?

    我不相信。

    可能感兴趣的链接:-

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多