android - 在 Android 中使用房间数据库写入迁移的查询错误
问题描述
我正在尝试在我的项目中迁移我的房间数据库,并为迁移编写查询。
在现有表上添加两个新列。这是代码。这是正确的吗?
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE pages ADD COLUMN sources TEXT NOT NULL default '')");
}
};
这是 AppDatabase 代码:
@Database(entities = {DayInfoEntity.class, UserEntryEntity.class, CycleInfoEntity.class, CycleInfoTempEntity.class, PagesEntity.class}, version = 2, exportSchema = true)
@TypeConverters({DateConverter.class})
public abstract class AppDatabase extends RoomDatabase {
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE pages ADD COLUMN sources TEXT NOT NULL default ''");
}
};
private static AppDatabase appDatabase;
@VisibleForTesting
private static final String DATABASE_NAME = "app_name";
public abstract PagesDao pagesDao();
private final MutableLiveData<Boolean> mIsDatabaseCreated = new MutableLiveData<>();
public static AppDatabase getInstance(final Context context) {
if (appDatabase == null) {
synchronized (AppDatabase.class) {
if (appDatabase == null) {
appDatabase = buildDatabase(context.getApplicationContext());
appDatabase.updateDatabaseCreated(context.getApplicationContext());
}
}
}
return appDatabase;
}
private static AppDatabase buildDatabase(final Context appContext) {
return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
.allowMainThreadQueries()
.addMigrations(MIGRATION_1_2)
.build();
}
private void updateDatabaseCreated(final Context context) {
if (context.getDatabasePath(DATABASE_NAME).exists()) {
setDatabaseCreated();
}
}
private void setDatabaseCreated() {
mIsDatabaseCreated.postValue(true);
}
}
当我当时尝试运行时,我收到了这个错误。
Migration didn't properly handle: pages.
Expected:
TableInfo{name='pages', columns={help=Column{name='help', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, privacyPolicy=Column{name='privacyPolicy', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, legend=Column{name='legend', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, info=Column{name='info', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, backstory=Column{name='backstory', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, language=Column{name='language', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, termsConditions=Column{name='termsConditions', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, sources=Column{name='sources', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='pages', columns={help=Column{name='help', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, legend=Column{name='legend', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, privacyPolicy=Column{name='privacyPolicy', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, info=Column{name='info', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, language=Column{name='language', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, sources=Column{name='sources', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue=''''}, termsConditions=Column{name='termsConditions', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
解决方案
我通过更改波纹管代码解决了这个问题。不要忘记fallbackToDestructiveMigration()
在数据库文件中添加这个:
有关更多详细信息,请检查此链接并阅读一次。我知道这很无聊,但必须阅读。阅读详细信息后,我知道我的错误。:)
这是链接 - https://developer.android.com/training/data-storage/room/migrating-db-versions
private static AppDatabase buildDatabase(final Context appContext) {
return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
.allowMainThreadQueries()
.fallbackToDestructiveMigration() // ADD THIS WHILE YOU DOIGN MIGRATION
.addMigrations(MIGRATION_1_2)
.build();
}
推荐阅读
- javascript - 如果在字符串内有条件
- arrays - 我可以快速覆盖下标吗?
- java - 仅在为 Android 编译时编译源代码?
- kafkajs - 用于 kafka 消费者应用程序的 kafkajs 代码中的意外令牌
- ios - FlatMap 对 Int 类型数组发出警告,但对 String 类型数组不发出警告
- java - 文件无法解析,因为 java 找不到
- android - 如何在不覆盖现有应用程序的情况下运行 Flutter 项目的副本?
- sql - 如何创建循环依赖成员凭证
- mysql - 从多个表中选择,即使一个表没有任何对应的记录
- mongodb - MongoDB 中的子查询,用于返回具有特定字段的单个元素