成功调用.build()后未调用RoomDatabase.Callback()的onCreate() [英] onCreate() of RoomDatabase.Callback() was not called after a successful call to .build()

查看:63
本文介绍了成功调用.build()后未调用RoomDatabase.Callback()的onCreate()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用Room Persisdent lib创建了MovieDatabase.根据RoomDatabase.Callback中onCreate()方法的文档,onCreate()首次创建数据库并创建所有表后调用.

I have created MovieDatabase using Room Persisdent lib. According to the documentation of onCreate() method in RoomDatabase.Callback, onCreate() to be called after the database is created for the first time, and all the tables were created.

在我调用buildPersistentDB()之后发生的事情是,我从MoviesDatabase类收到了日志,该类使用@Database进行了注释,但是来自RoomDatabase.Callback中的onCreate()的日志却是我打过电话就没打过电话

What happend after I called buildPersistentDB() is, I received logs from MoviesDatabase class, the class that is annotated with @Database, but the logs from onCreate() in RoomDatabase.Callback were never called despite I called:

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

buildPersistentDB()方法中清楚地显示了我创建数据库的方式.我还发布了MovieDatabase类,如下所示.

The way I created the database is clearly shown in the buildPersistentDB() method. I also posted MovieDatabase class as shown below.

我想知道为什么尽管成功创建了数据库,但Room.Callback中的onCreate()方法没有收到日志

I would like to know why I did not receive logs from onCreate() method in Room.Callback despite the database was created successfully

代码_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.v(TAG_LOG + "->onCreate", " buildPersistentDB->DB is created, all tables has been created");
            Log.d(TAG_LOG + "->onCreate", " buildPersistentDB->DB db.getPath(): " + db.getPath());
            Log.d(TAG_LOG + "->onCreate", " buildPersistentDB->DB db.toString(): " + db.toString());
            Log.d(TAG_LOG + "->onCreate", " buildPersistentDB->DB db.isOpen(): " + db.isOpen());
            Log.d(TAG_LOG + "->onCreate", " buildPersistentDB->DB db.isReadOnly(): " + db.isReadOnly());
        }

        @Override
        public void onOpen(@NonNull SupportSQLiteDatabase db) {
            super.onOpen(db);
            Log.v(TAG_LOG + "->onOpen", " buildPersistentDB->onCreate");
            Log.d(TAG_LOG + "->onOpen", " buildPersistentDB->DB has been opened");
        }
    });
    this.mMovieDatabase = this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();
     Log.d(TAG_LOG + "->buildPersistentDB", "->this.mMovieDatabase.isOpen(): " + this.mMovieDatabase.isOpen());
}//eof-buildPersistentDB

代码_2 :

//class - The abstract class which is annotated with Database and extends RoomDatabase.
@Database(entities = {Movie.class}, version = 1, exportSchema = false)
public abstract class MovieDatabase extends RoomDatabase {
private final static String TAG_LOG = MovieDatabase.class.getSimpleName();

public abstract IDatabaseAccessObject dao();

public MovieDatabase() {
    super();
    Log.w(TAG_LOG, "->MovieDatabase constructor is called.");
}

@Override
public void init(@NonNull DatabaseConfiguration configuration) {
    super.init(configuration);
    Log.w(TAG_LOG, "->init is called.");
}

@NonNull
@Override
public SupportSQLiteOpenHelper getOpenHelper() {
    Log.w(TAG_LOG, "->init is called.");
    return super.getOpenHelper();
}

@NonNull
@Override
protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration config) {
    Log.w(TAG_LOG, "->createOpenHelper is called.");
    Log.d(TAG_LOG, "->createOpenHelper->config.name:" + config.name);
    Log.d(TAG_LOG, "->createOpenHelper->config.callbacks:" + config.callbacks);
    Log.d(TAG_LOG, "->createOpenHelper->config.requireMigration:" + config.requireMigration);
    return null;
}

@NonNull
@Override
protected InvalidationTracker createInvalidationTracker() {
    Log.w(TAG_LOG, "->createInvalidationTracker is called.");
    return null;
}

@Override
public void clearAllTables() {
    Log.w(TAG_LOG, "->clearAllTables is called.");
}
}

logcat :

2018-12-13 14:37:54.665 8949-8949 V/ActMain: ->initPersistentDBHandlerThread <-
2018-12-13 14:37:54.666 8949-8949 V/ActMain->RoomPersistentDBHandlerThread: RoomPersistentDBHandlerThread constructor is called.
2018-12-13 14:37:54.666 8949-8949 V/ActMain->RoomPersistentDBHandlerThread: initHandler is called
2018-12-13 14:37:54.667 8949-8967 V/ActMain->RoomPersistentDBHandlerThread: onLooperPrepared is called. [getLooper: Looper (ROOM_PERSISTENT_DB_HANDLER_THREAD, tid 356) {cbd0ffd}] ++++++++++++++++++++++++ 
2018-12-13 14:37:54.667 8949-8967 V/ActMain->RoomPersistentDBHandlerThread: ++++++++++++++++++++++++  [getLooper: Looper (ROOM_PERSISTENT_DB_HANDLER_THREAD, tid 356) {cbd0ffd}] ++++++++++++++++++++++++ 
2018-12-13 14:37:54.670 8949-8949 V/ActMain->RoomPersistentDBHandlerThread: enqueueMessage is called for what = 1
2018-12-13 14:37:54.670 8949-8967 V/ActMain->RoomPersistentDBHandlerThread: handleMessage is called for msg.what = 1
2018-12-13 14:37:54.670 8949-8967 V/ActMain: ->buildPersistentDB <-
2018-12-13 14:37:54.673 8949-8967 W/MovieDatabase: ->MovieDatabase constructor is called. <-
2018-12-13 14:37:54.673 8949-8967 W/MovieDatabase: ->init is called. <-
2018-12-13 15:02:54.802 9384-9403 D/ActMain->buildPersistentDB: ->this.mMovieDatabase.isOpen(): false

推荐答案

之所以未调用 OnCreate 的原因是,它在第​​一次创建数据库时仅被调用一次,然后再也不会被调用只要数据库存在.

The reason why OnCreate isn't being called is because it is only called once when the database is first created and then never again as long as the database exists.

如果删除该应用程序的数据或卸载该应用程序然后重新运行,您将看到随后调用 onCreate .

If you delete the App's data or uninstall the App and then rerun it you will see that onCreate is then called.

例如

private void BuildDatabase() {
   RoomDatabase.Builder roombuilder = Room.databaseBuilder(this, Database.class,"mydb");
   roombuilder.addCallback(new RoomDatabase.Callback() {
       @Override
       public void onCreate(@NonNull SupportSQLiteDatabase db) {
           super.onCreate(db);
           Log.d("ONCREATE","Database has been created.");
       }

       @Override
       public void onOpen(@NonNull SupportSQLiteDatabase db) {
           super.onOpen(db);
           Log.d("ONOPEN","Database has been opened.");
       }
   });
   mRoomDB = (Database) roombuilder.build();
}

删除应用程序的数据后,结果为:-

After deleting the App's data results in :-

2018-12-20 06:36:23.045 2271-2287/so53839431.so53839431roomrelationship D/ONCREATE: Database has been created.
2018-12-20 06:36:23.055 2271-2287/so53839431.so53839431roomrelationship D/ONOPEN: Database has been opened.

这篇关于成功调用.build()后未调用RoomDatabase.Callback()的onCreate()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆