Java 如何更改房间数据库的主键?
更改主键需要更新数据库版本。是否有任何方法可以使用房间中的迁移类将我的主键从一个字段更改为另一个字段?如果没有,如何更改主键?下面是我的Java 如何更改房间数据库的主键?,java,android,database,sqlite,android-room,Java,Android,Database,Sqlite,Android Room,更改主键需要更新数据库版本。是否有任何方法可以使用房间中的迁移类将我的主键从一个字段更改为另一个字段?如果没有,如何更改主键?下面是我的实体的一个片段 @Entity(tableName = "weather") public class Weather { @PrimaryKey @NonNull @ColumnInfo(name = "id") private final String id; @NonNull @ColumnInfo(nam
实体的一个片段
@Entity(tableName = "weather")
public class Weather {
@PrimaryKey
@NonNull
@ColumnInfo(name = "id")
private final String id;
@NonNull
@ColumnInfo(name = "city")
private final String city;
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE weather CHANGE id city VARCHAR(22) NOT NULL;");
}
};
我想从id
切换到city
只是一个提示:房间假设您的实体/pojo的属性名称是您希望使用的列名。ColumnInfo注释中的name值的目的是为该属性设置不同的列名。sql语句甚至不提供该名称。CHANGE不是有效的SQLite命令。不知道为什么这是公认的答案。最好的方法是创建一个新表,将数据从旧表复制到新表,删除旧表,然后将新表重命名为旧表。
@Entity(tableName = "weather")
public class Weather {
@PrimaryKey
@NonNull
@ColumnInfo(name = "id")
private final String id;
@NonNull
@ColumnInfo(name = "city")
private final String city;
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE weather CHANGE id city VARCHAR(22) NOT NULL;");
}
};