如何在Room数据库中使用创建和打开回调功能

时间:2018-12-12 13:22:40

标签: android android-sqlite android-room

在代码中,我从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);
    }
 }

1 个答案:

答案 0 :(得分:0)

  

1-为什么未调用回调

onCreate 回调仅在数据库的生存期内(即打开文件时)被调用一次。

  • 它允许您执行其他操作,例如也许创建一个或多个未被Room覆盖的表。

无论何时打开数据库,都会调用 onOpen 回调

  • 它可以让您做您不希望被Room覆盖的事情。

仅在构建数据库时不会打开基础SQLite数据库,直到您尝试访问该数据库(即获取,添加,删除或更新数据)时,才打开并创建该数据库。

  

2-回调中提供的db对象的目的是什么,以及   如何使用它们?它包含类似....

的方法

db 是一个SupportSQLiteDatabase对象,如果使用回调,您可能会希望执行Room不支持的操作(例如,出于某种原因添加不属于room的表)。要添加表,您需要能够运行SQL来创建该表,然后使用db.execSQL(your_SQL_as_a_String);以及因此传递SupportSQLiteDatabase的原因。

在会议室中,术语SupportSQLiteDatabase是:-

  •   

    一种数据库抽象,它删除了框架依赖性并   允许交换基础的sql版本。它模仿了   SQLiteDatabase。