• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-11-6 16:15:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 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
    }



Best Answer-推荐答案


我花了一段时间才明白为什么在数据库构建器上调用 .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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap