在代码中,我从Room.databaseBuilder中获得了一个实例,添加了一个回调,最后我建立了数据库。 致电
后this.mMovieDatabase =
this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();
我希望回调内的日志被调用,但是没有发生。调用insertTuplePersistentDB()时,会调用回调内的日志。
我的问题:
1-为什么未调用回调
this.mMovieDatabase =
this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();
此行何时执行?
2-回调中提供的db对象的目的是什么,以及如何使用它们?它包含类似
的方法.update()
.delete()
.execSql()
代码_1 :
public void buildPersistentDB() {
Log.v(TAG_LOG, "->buildPersistentDB");
this.mMovieDBPersistentBuilder = Room
.databaseBuilder(getApplicationContext(),
MovieDatabase.class, ActMain.DATA_BASE_NAME);
this.mMovieDBPersistentBuilder.addCallback(new
RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Log.w(TAG_LOG + "->onCreate", " buildPersistentDB->DB is
created, all tables has been created");
Log.w(TAG_LOG + "->onCreate", " buildPersistentDB->DB
db.getPath(): " + db.getPath());
Log.w(TAG_LOG + "->onCreate", " buildPersistentDB->DB
db.toString(): " + db.toString());
Log.w(TAG_LOG + "->onCreate", " buildPersistentDB->DB
db.isOpen(): " + db.isOpen());
Log.w(TAG_LOG + "->onCreate", " buildPersistentDB->DB
db.isReadOnly(): " + db.isReadOnly());
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
Log.w(TAG_LOG + "->onOpen", "
buildPersistentDB->onCreate\n");
Log.w(TAG_LOG + "->onOpen", " buildPersistentDB->DB has been
opened");
}
});
this.mMovieDatabase =
this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();
}
private void insertTuplePersistentDB(int recordNum) {
Log.v(TAG_LOG, "->insertTuplePersistentDB is called. recodNum: " +
recordNum);
Movie movie = new Movie();
for (int i = 1; i <= recordNum; i++) {
movie.setMovieId(String.valueOf(i));
movie.setMovieName("Movie_episode_" + String.valueOf(i));
mMovieDatabase.dao().insertOnlySingleMovie(movie);
}
}
答案 0 :(得分:0)
1-为什么未调用回调
onCreate 回调仅在数据库的生存期内(即打开文件时)被调用一次。
无论何时打开数据库,都会调用 onOpen 回调
仅在构建数据库时不会打开基础SQLite数据库,直到您尝试访问该数据库(即获取,添加,删除或更新数据)时,才打开并创建该数据库。
2-回调中提供的db对象的目的是什么,以及 如何使用它们?它包含类似....
的方法
db 是一个SupportSQLiteDatabase对象,如果使用回调,您可能会希望执行Room不支持的操作(例如,出于某种原因添加不属于room的表)。要添加表,您需要能够运行SQL来创建该表,然后使用db.execSQL(your_SQL_as_a_String);
以及因此传递SupportSQLiteDatabase的原因。
在会议室中,术语SupportSQLiteDatabase是:-
一种数据库抽象,它删除了框架依赖性并 允许交换基础的sql版本。它模仿了 SQLiteDatabase。