как использовать создание и открытие обратного вызова в базе данных комнат - PullRequest
0 голосов
/ 12 декабря 2018

В коде я получил экземпляр из 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);
    }
 }

1 Ответ

0 голосов
/ 15 декабря 2018

1 - почему обратные вызовы не были вызваны

Обратный вызов onCreate будет вызываться только один раз за время существования базы данных, т.е. когда файл открыт.

  • Позволяет вам делать другие вещи, например, возможно, создавать таблицу или таблицы, которые находятся или не покрыты Room.

onOpen Обратный вызов будет вызываться всякий раз, когда база данных была открыта (см. ниже)

  • Это позволяет вам делать вещи, которые вы, возможно, пожелаете сделать, не покрываемые Room.

Простое построение базы данных не открывает базовую базу данных SQLite, пока вы не попытаетесь получить доступ к базе данных, то есть получить, добавить, удалить или обновить данные, которые база данных открыта и создана при необходимости.

2 - какова цель объекта db, предоставляемого в обратном вызове, и как их использовать? Он содержит такие методы, как ....

db является объектом SupportSQLiteDatabase, и если вы используете обратный вызов, вы быКелли хочет сделать что-то, что не поддерживается Room (например, добавить эту таблицу, не покрытую комнатой по любой причине).Чтобы добавить таблицу, вы должны иметь возможность запустить SQL для СОЗДАНИЯ таблицы, и тогда вы будете использовать db.execSQL(your_SQL_as_a_String); и, следовательно, почему пропускается SupportSQLiteDatabase.

В терминологии Room SupportSQLiteDatabase: -

  • Абстракция базы данных, которая удаляет зависимость фреймворка и позволяет менять базовые версии sql.Он имитирует поведение SQLiteDatabase.

...