use*_*303 3 android sqliteopenhelper android-sqlite android-room
我已经使用 Room Persisdent lib 创建了 MovieDatabase。根据 RoomDatabase.Callback 中 onCreate() 方法的文档,onCreate() 在第一次创建数据库后调用,所有表都创建完毕。
在我调用 buildPersistentDB() 之后发生的事情是,我收到了来自 MoviesDatabase 类的日志,该类用@Database 进行了注释,但是尽管我调用了 RoomDatabase.Callback 中来自 onCreate() 的日志,但从未调用过:
this.mMovieDatabase = this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();
Run Code Online (Sandbox Code Playgroud)
我创建数据库的方式清楚地显示在 buildPersistentDB() 方法中。我还发布了 MovieDatabase 类,如下所示。
我想知道为什么我没有从 Room.Callback 中的 onCreate() 方法收到日志,尽管数据库已成功创建
代码_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
Run Code Online (Sandbox Code Playgroud)
代码_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.");
}
}
Run Code Online (Sandbox Code Playgroud)
日志猫:
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
Run Code Online (Sandbox Code Playgroud)
Mik*_*keT 15
没有调用OnCreate的原因是因为它只在第一次创建数据库时调用一次,然后只要数据库存在就不会再调用。
如果您删除应用程序的数据或卸载应用程序然后重新运行它,您将看到然后调用onCreate。
例如
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();
}
Run Code Online (Sandbox Code Playgroud)
删除应用程序的数据结果后:-
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.
Run Code Online (Sandbox Code Playgroud)
Oncreate创建数据库后将调用该方法。Room数据库是SQLiteOpenHelper的抽象。调用 getReadableDatabase() 或 getWriteableDatabase() 时创建的数据库。因此,直到执行一些具体操作,例如调用命中数据库的@Dao方法,数据库才会被创建。
要解决该问题,您应该应用以下选项之一。
执行一些操作,包括@delete、@insert 或@update
或者
卸载应用程序之前,请删除手机设置中的应用程序数据
或者
手动删除数据库文件(com.company.yourappAndroid Studio 上的设备文件资源管理器 → 数据 → 数据 → → 数据库)。
或者
在您的项目中调用以下代码:
public void deleteDatabaseFile(String databaseName) {
File databases =
new File(getApplicationInfo().dataDir + "/databases");
File db = new File(databases, databaseName);
if (db.delete())
Timber.d("Database deleted successfully");
else
Timber.d("Failed to delete database");
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3411 次 |
| 最近记录: |