room 数据库初始化细节

Room

AppDatabase database = AppDatabase.getInstance(this, new AppExecutors());
            TemplateDao templeteDao = database.templeteDao();
            List<PrintTemplate> printTemplates = templeteDao.queryTemplateByField("title", "Box");//不查询就不触发自动,真贱
            Log.w(TAG,"PrintTemplate:"+printTemplates);//这里不能关闭数据库,否则将无法正常初始化。

如果在application的初始化中直接close,那么也会导致初始化失败,初始化的地方是回调。

private static AppDatabase buildDatabase(final Context appContext,
            final AppExecutors executors) {
        return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
                .allowMainThreadQueries()//允许主线程查询
                .setJournalMode(JournalMode.WRITE_AHEAD_LOGGING)
                .addCallback(new Callback() {
                    @Override
                    public void onCreate(@NonNull SupportSQLiteDatabase db) {
                        super.onCreate(db);
                        executors.diskIO().execute(() -> {
                            // Add a delay to simulate a long-running operation 添加延迟以模拟长时间运行的操作

                            if(BuildConfig.DEBUG){
                                Log.w("Appdatabase","DATABASE_INIT");
                            }
                            // Generate the data for pre-population 生成预人口数据
                            AppDatabase database = AppDatabase.getInstance(appContext, executors);
                            List<PrintTemplate> templeteEntries = DataGenerator.generateTempletes();
                            insertData(database, templeteEntries);
                            // notify that the database was created and it's ready to be used MutableLiveData flag=true
                            database.setDatabaseCreated();

                        });
                    }
                })
            .addMigrations(MIGRATION_1_2)//迁移
            .build();
    }

如上可以看到是在

.addCallback(new Callback() {
                    @Override
                    public void onCreate(@NonNull SupportSQLiteDatabase db) {

里面触发的,但是关闭就会导致初始化基本上失败的,关闭了还不影响我查询操作,但是初始化失败的,关于该不该关闭的问题网上也有各种说法,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Room 是一个 ORM(对象关系映射)库,用于在 Android 应用中轻松地使用 SQLite 数据库。如果你需要升级 Room 数据库,通常是在应用版本迭代或引入新功能时,可能需要更新数据模型、添加新的迁移操作或者调整现有表结构。以下是升级 Room 数据库的基本步骤: 1. **更新数据模型**:首先,检查 Room entity(实体类)是否需要更新。如果添加了新的字段或修改了现有字段的数据类型,记得在对应的 entity 类中进行相应的更改。 2. **修改迁移文件**:Room 使用 Migration(迁移)来管理数据库结构的变化。在 `app/src/main/java/[package]/db/Migration` 文件中,创建新的迁移步骤。每次迁移都应增加一个版本号,比如从 `0` 到 `1`,`1` 到 `2` 等。在这个过程中,要确保数据完整性,处理好旧数据和新增字段的关系。 - 如果是添加新字段,Room 会默认为 `NOT NULL` 和默认值,但可能需要根据实际情况调整。 - 对于删除字段,记得在迁移中设置适当的策略,如设置为 `NULL` 或清除数据。 3. **配置 Room Database**:在 `RoomDatabase` 类中,确保正确设置了迁移规则,例如: ```kotlin @Database(entities = [YourEntity::class], version = RoomDatabase.VERSION, exportSchema = false) abstract class YourDatabase : RoomDatabase() { // ... override fun onCreate() { super.onCreate() Migration.migrate(this, yourDatabaseVersion) } } ``` 4. **运行迁移**:在应用启动时,Room 会自动执行迁移操作。如果在运行时发现版本不匹配,用户可能需要手动更新应用才能完成迁移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值