【问题标题】:how to use create and open callback in Room database如何在 Room 数据库中使用创建和打开回调
【发布时间】:2018-12-12 13:22:39
【问题描述】:

在代码中,我从 Room.databaseBuilder 获得了一个实例,添加了一个回调,最后我构建了数据库。 打完电话后

this.mMovieDatabase =  
this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();

我希望回调中的日志会被调用,但这并没有发生。当调用 insertTuplePersistentDB() 时,回调中的日志被调用。

我的问题:

1-为什么没有调用回调

this.mMovieDatabase = 
this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();

这行代码什么时候执行的??

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

.update()

.delete()

.execSql()

code_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);
    }
 }

【问题讨论】:

    标签: android android-sqlite android-room


    【解决方案1】:

    1-为什么没有调用回调

    onCreate 回调只会在数据库的生命周期内(即打开文件时)调用一次。

    • 它允许您做其他事情,例如也许创建一张或多张被 Room 覆盖或不被覆盖的桌子。

    onOpen 回调将在数据库打开时调用(见下文)

    • 它允许您执行 Room 未涵盖的操作。

    仅仅构建数据库并不会打开底层的 SQLite 数据库,直到您尝试访问数据库,即获取、添加、删除或更新数据,数据库才会在必要时打开和创建。强>

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

    db 是一个 SupportSQLiteDatabase 对象,如果使用回调,您可能希望执行 Room 不支持的操作(例如,添加此表,无论出于何种原因,该表都没有被 Room 覆盖)。要添加表,您需要能够运行 SQL 来创建表,然后您将使用 db.execSQL(your_SQL_as_a_String);,这就是传递 SupportSQLiteDatabase 的原因。

    在 Room 的术语中 SupportSQLiteDatabase 是:-

    • 一种数据库抽象,它消除了框架依赖和 允许交换底层 sql 版本。它模仿的行为 SQLite 数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多