gpt4 book ai didi

java - 房间数据库强制 OnCreate 回调

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:04 28 4
gpt4 key购买 nike

我正在使用需要预填充数据的 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
}

最佳答案

我花了一段时间才明白为什么在数据库构建器上调用 .build() 后 Room 数据库没有填充初始数据。

对我来说,仅在真正的读/写操作时触发迁移和回调确实违反直觉。实际上,问题是由 Room 使用 class RoomOpenHelper 引起的,如文档中所述:

An open helper that holds a reference to the configuration until the database is opened.

因此,配置和所有回调都存储在 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

之后将创建数据库并填充初始数据。

关于java - 房间数据库强制 OnCreate 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280941/

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