Jam*_*ido 10 java android android-room
我正在使用RoomDatabase开发一个需要预先填充其数据的应用程序; 我已经设法通过添加onCreate()回调来实现它,但只有在第一次访问数据库时才会调用它(比如调用其中一个Daos函数).
有没有办法在不进行任何读或写操作的情况下强制创建数据库?
这是我的代码,MyDatabase.get()被称为App.onCreate()
@Database(entities = {Entity1.class, Entity2.class}, version = 1, exportSchema = true)
public abstract class MyDatabase extends RoomDatabase {
private static MyDatabase sInstance;
public synchronized static TaxCodeDatabase get(Context context) {
if (sInstance == null) {
sInstance = buildDatabase(context);
}
return sInstance;
}
private static MyCodeDatabase buildDatabase(final Context context) {
return Room.databaseBuilder(context,
MyCodeDatabase.class,
"my-database")
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
sInstance.preFillData(context);
});
}
})
.build();
}
public abstract Entity1Dao entity2Dao();
public abstract Entity2Dao entity1Dao();
/**
* Populates the database with a series of initial data
*
* @param aContext
*/
public void prePopulateData(Context aContext) {
//Populate database here
}
Run Code Online (Sandbox Code Playgroud)
Max*_*xim 14
我花了一些时间来理解为什么在调用.build()数据库构建器之后没有使用初始数据填充Room数据库.
至于我,实际上反直觉的是,只有在真正的读/写操作时才会触发迁移和回调.实际上由于房间使用的原因导致的问题class RoomOpenHelper,如文件中所述:
一个打开的帮助程序,它保存对配置的引用,直到打开数据库.
结果,配置和所有回调存储在RoomOpenHelper类的实例中而Sqlite SQLiteOpenHelper实际执行数据库迁移,而不是创建(Java中的延迟类加载).
要克服此行为,getWritableDatabase()应执行任何导致操作的操作.我最终采用了以下方法:
RoomDatabase db = Room.databaseBuilder(context,
...)
.build();
// and then
db.beginTransaction()
db.endTransaction()
// or query a dummy select statement
db.query("select 1", null)
return db
Run Code Online (Sandbox Code Playgroud)
之后,将创建数据库并使用初始数据填充.
有没有办法强制创建数据库而不进行任何读取或写入操作?
不,对不起。
不过,没有什么能阻止您在调用 Room 之前将预先填充的数据库复制到位。您需要确保预先填充的数据库中包含 Room 的元数据(例如,通过使用 Room 本身创建该数据库)。
| 归档时间: |
|
| 查看次数: |
2917 次 |
| 最近记录: |