如果事务确实更新了数据库,则在事务发生时保存数据。每当执行 SQL 语句时,默认情况下都会有一个事务。
但是,可以通过发出BEGIN TRANSACTION 后跟语句,然后发出COMMIT TRANSACTION 或END TRANSACTION(如果认为执行成功)来对语句进行分组,然后更新文件。
如果认为执行不成功,则可以发出ROLLBACK TRANACTION,在这种情况下,更改将被撤消并回滚。
以上是根据 SQLite。 Room 是 SQLite 的包装器,它提供 @Transaction 注释并通过 Room 数据库访问 beginTransaction、setTransactionSuccessful 和 endTransaction 方法以及另外的 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???? 方法在数据库文件不存在时执行复制。
是否有简明的解释或图表来理解这个过程在高层次上是如何工作的?
我不相信。
可能感兴趣的链接:-