Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改房间数据库的主键?_Java_Android_Database_Sqlite_Android Room - Fatal编程技术网

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;");
    }
};