android - android.database.sqlite.SQLiteException: no such column: id (code 1 SQLITE_ERROR): , 同时从旧版本的 db 编译到新版本
问题描述
@Database(entities = {HoroscopeResponse.class, HoroscopeData.class, EmojiBean.class, DailyHoroscopeTimeStamp.class, WeeklyHoroscopeTimeStamp.class
, MonthlyHoroscopeTimeStamp.class, YearlyHoroscopeTimeStamp.class}, version = 4, exportSchema = false)
public abstract class HoroscopeDatabase extends RoomDatabase {
private static final String LOG_TAG = "Horoscope_database";
private static final Object LOCK = new Object();
private static final String DATABASE_NAME = "horoscope_database";
private static HoroscopeDatabase sInstance;
public static HoroscopeDatabase getInstance(Context context) {
if (sInstance == null) {
synchronized (LOCK) {
Migration migration2_3 = new Migration(2,3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS 'emoji_table' ('date' INTEGER NOT NULL,'emoji' INTEGER NOT NULL, 'month' TEXT NOT NULL,'year' TEXT NOT NULL,'day' TEXT NOT NULL,'beanpos' INTEGER NOT NULL, PRIMARY KEY ('id') ); ");
}
};
Migration migration1_2 = new Migration(1,2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE 'horoscope_data' ADD COLUMN'rashiDescriptionEng' TEXT DEFAULT ''");
}
};
Migration migration3_4 = new Migration(3,4) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE 'emoji_table' RENAME COLUMN 'id' TO '_id'");
}
};
Log.d(LOG_TAG, "Creating new database instance");
sInstance = Room.databaseBuilder(context.getApplicationContext(),
HoroscopeDatabase.class, HoroscopeDatabase.DATABASE_NAME)
.addMigrations(migration1_2)
.addMigrations(migration2_3)
.addMigrations(migration3_4)
.allowMainThreadQueries()
.build();
}
}
Log.d(LOG_TAG, "Getting the database instance");
return sInstance;
}
}
我在迁移 1_2 中创建 emoji_table 时出现错误(用于从旧的 db 应用程序版本迁移,否则很好)无法启动活动 ComponentInfo{MainActivity}:android.database.sqlite.SQLiteException:没有这样的列:id(代码 1 SQLITE_ERROR) : , 编译时: CREATE TABLE IF NOT EXISTS 'emoji_table'
解决方案
错误正如它所说的那样。那就是你有: -
CREATE TABLE IF NOT EXISTS 'emoji_table' ('date' INTEGER NOT NULL,'emoji' INTEGER NOT NULL, 'month' TEXT NOT NULL,'year' TEXT NOT NULL,'day' TEXT NOT NULL,'beanpos' INTEGER NOT NULL, PRIMARY KEY ('id') );
并且没有id列可以用作主键。
相反,您想要/需要类似的东西:-
CREATE TABLE IF NOT EXISTS 'emoji_table' ('id' INTEGER, 'date' INTEGER NOT NULL,'emoji' INTEGER NOT NULL, 'month' TEXT NOT NULL,'year' TEXT NOT NULL,'day' TEXT NOT NULL,'beanpos' INTEGER NOT NULL, PRIMARY KEY ('id') );
使用 Room 实体规则,因此您需要确保EmojiBean.class
(我假设这是正确的实体)确实具有id的字段/变量,尽管当您将迁移 3 到 4 中的列重命名时,字段/变量应该是_id或有一个命名列 _id 的 @ColumnInfo 注释)。
推荐阅读
- python - 尝试制作屏幕截图时如何修复python-selenium崩溃?
- python - 将 pycharm 项目编译成单个 .py 文件?
- python - TypeError:无法将系列转换为
在熊猫 - arrays - Azure 逻辑应用 - 创建仅包含一个对象的数组
- flutter - 通过 ID Dart 在多个数组中查找匹配的算法?
- excel - 我可以根据条件在 PowerQuery 中实施步骤吗?
- javascript - Javascript - 概括一个可以以两种不同方式但在相同上下文中使用的函数
- mysql - 当我运行多个 MySQL Docker 映像时,是否仍保留数据库一致性?
- css - 触摸另一张图片时更改图像的位置 CSS
- java - java maven imageIcon