当调用onCreate
回调时,数据库已经创建.根据再次调用创建
super.onCreate
将try 再次创建数据库,创建完全相同的文件,因此遇到锁.
数据库传递给回调,因此为db: SupportSQLiteDatabase
考虑作为一个例子:-
....
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
//super.onCreate(db)
//val provideDatabase = provideDatabase(applicationContext)
//provideDatabase.userDao().createUser(LocalUser())
DatabaseUtils.dumpCursor(db.query("SELECT * FROM sqlite_master"))
}
})
.build()
其中,查询模式(SQLite_master)并转储生成的指针(输出到日志(log)).例如,使用上述结果:-
2024-04-17 17:33:55.152 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@68ac7e0
2024-04-17 17:33:55.152 I/System.out: 0 {
2024-04-17 17:33:55.152 I/System.out: type=table
2024-04-17 17:33:55.152 I/System.out: name=android_metadata
2024-04-17 17:33:55.152 I/System.out: tbl_name=android_metadata
2024-04-17 17:33:55.152 I/System.out: rootpage=3
2024-04-17 17:33:55.152 I/System.out: sql=CREATE TABLE android_metadata (locale TEXT)
2024-04-17 17:33:55.153 I/System.out: }
2024-04-17 17:33:55.153 I/System.out: 1 {
2024-04-17 17:33:55.153 I/System.out: type=table
2024-04-17 17:33:55.153 I/System.out: name=tasks
2024-04-17 17:33:55.153 I/System.out: tbl_name=tasks
2024-04-17 17:33:55.153 I/System.out: rootpage=4
2024-04-17 17:33:55.153 I/System.out: sql=CREATE TABLE `tasks` (`taskId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL)
2024-04-17 17:33:55.153 I/System.out: }
2024-04-17 17:33:55.153 I/System.out: 2 {
2024-04-17 17:33:55.153 I/System.out: type=table
2024-04-17 17:33:55.153 I/System.out: name=sqlite_sequence
2024-04-17 17:33:55.153 I/System.out: tbl_name=sqlite_sequence
2024-04-17 17:33:55.153 I/System.out: rootpage=5
2024-04-17 17:33:55.153 I/System.out: sql=CREATE TABLE sqlite_sequence(name,seq)
2024-04-17 17:33:55.153 I/System.out: }
2024-04-17 17:33:55.153 I/System.out: 3 {
2024-04-17 17:33:55.153 I/System.out: type=table
2024-04-17 17:33:55.153 I/System.out: name=TaskTaskCR
2024-04-17 17:33:55.153 I/System.out: tbl_name=TaskTaskCR
2024-04-17 17:33:55.153 I/System.out: rootpage=6
2024-04-17 17:33:55.153 I/System.out: sql=CREATE TABLE `TaskTaskCR` (`parentTaskId` INTEGER NOT NULL, `childTaskId` INTEGER NOT NULL, PRIMARY KEY(`parentTaskId`, `childTaskId`))
2024-04-17 17:33:55.153 I/System.out: }
2024-04-17 17:33:55.153 I/System.out: 4 {
2024-04-17 17:33:55.153 I/System.out: type=index
2024-04-17 17:33:55.153 I/System.out: name=sqlite_autoindex_TaskTaskCR_1
2024-04-17 17:33:55.153 I/System.out: tbl_name=TaskTaskCR
2024-04-17 17:33:55.153 I/System.out: rootpage=7
2024-04-17 17:33:55.154 I/System.out: sql=null
2024-04-17 17:33:55.154 I/System.out: }
2024-04-17 17:33:55.154 I/System.out: 5 {
2024-04-17 17:33:55.154 I/System.out: type=table
2024-04-17 17:33:55.154 I/System.out: name=room_master_table
2024-04-17 17:33:55.154 I/System.out: tbl_name=room_master_table
2024-04-17 17:33:55.154 I/System.out: rootpage=8
2024-04-17 17:33:55.154 I/System.out: sql=CREATE TABLE room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)
2024-04-17 17:33:55.154 I/System.out: }
2024-04-17 17:33:55.154 I/System.out: <<<<<
即,可以看出,数据库由以下内容组成:-
- 表100*(包含区域设置的Android特定系统表)
- 表101(按照
@Entity
注释类的应用表)
- 表100(由于使用了AutoINCREMENT,因此SQLite系统表)
- 表101(按照
@Entity
注释类的应用表)
- 索引100(由SQLite自动生成)
- 表100(包含模式哈希值的Room表,用于判断模式是否已更改)
What you should be doing is utilising the passed SupportSQLiteDatabase to initialise the data.这就是它被传递给回调的原因.
例如db.execSQL("INSERT INTO tasks (name) VALUES('Task001')")
- 显然,这适合用于此答案的数据库,并且很可能不是您要使用的数据库.
使用上面的内容和额外的行,然后应用程序判断,运行后显示:-
- 即该行已添加
- 其他行稍后添加,因为演示使用了之前答案中未更改的代码.