gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:11:02 25 4
gpt4 key购买 nike

在代码中,我从 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-why the callbacks has not been called

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

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

只要数据库打开,就会调用onOpen 回调(见下文)

  • 它允许您做 Room 未涵盖的您可能希望做的事情。

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

2-what is the purpose of the db object provided in the callback, and how to use them??it contains methods like ....

db 是一个 SupportSQLiteDatabase 对象,如果使用回调,您可能想做一些 Room 不支持的事情(例如,添加这个由于任何原因而没有被 room 覆盖的表)。要添加一个表,您需要能够运行 SQL 来创建表,然后您将使用 db.execSQL(your_SQL_as_a_String);这就是为什么传递 SupportSQLiteDatabase 的原因。

在 Room 的术语中,SupportSQLiteDatabase 是:-

  • A database abstraction which removes the framework dependency and allows swapping underlying sql versions. It mimics the behavior of SQLiteDatabase.

关于android - 如何在 Room 数据库中使用创建和打开回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53744016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com