这是我的AppDatabase代码。我刚开始使用ChatUser
和ChatMessage
作为可以正常工作的实体,但是后来我想添加Well
。我整理了所有内容,并将它们与回调中的两行预初始化数据库一起添加到了此类中。问题是这将无法正常工作。即使我更改版本号或卸载应用程序,数据库也不会预先初始化。它是第一个运行的版本,因此我无法在数据库上成功进行迭代。请帮忙!
@Database(entities = {ChatUser.class, ChatMessage.class, Well.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract UserDao userDao();
public abstract MessageDao messageDao();
public abstract WellDao wellDao();
public static AppDatabase getAppDatabase(final Context context) {
Log.d("AppDatabase", "getting app database");
if (INSTANCE == null) {
INSTANCE =
Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "curadite-database")
.fallbackToDestructiveMigration()
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Log.d("AppDatabase", "OnCreate");
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
ChatUser user = new ChatUser("Me", true);
ChatMessage message = new ChatMessage("Hello!", 1, System.currentTimeMillis());
AppDatabase db = getAppDatabase(context);
db.userDao().insertAll(user);
db.messageDao().insertAll(message);
Well[] wells = new Curapac(7, 2).flatWells();
db.wellDao().insertAll(wells);
}
});
}
})
.build();
}
return INSTANCE;
}
答案 0 :(得分:0)
您的Callback
方法(使用线程使您的初始化发生在将来的某个未知时间)并不是很可靠。不需要getAppDatabase()
的调用者使用它之前完成您的初始化工作。
要么:
在SupportSQLiteDatabase
内部同步使用提供的onCreate()
来填充数据库,或者
在调用build()
之后和退出if
方法中的getAppDatabase()
块之前填充数据库,检查当前数据库内容以查看是否需要执行初始化
此外,您管理此单例的整体方法将无法很好地处理对getAppDatabase()
的同时调用。请将INSTANCE
标记为volatile
,并将getAppDatabase()
标记为synchronized
。