房间数据库 - 编辑实体
Room database - edit entities
我有一个问题。我从这里编辑了我的房间实体:
@Entity(tableName = "users")
public class User {
public User(String username, String email, String password){
this.username = username;
this.email = email;
this.password = password;
}
public User() {}
@PrimaryKey
@ColumnInfo(name = "Username")
private String username;
@ColumnInfo(name = "Email")
private String email;
@ColumnInfo(name = "Password")
private String password;
//getters setters
到这个表格:
@Entity(tableName = "users")
public class User {
public User(String username, String email, String password){
this.username = username;
this.email = email;
this.password = password;
}
public User() {}
//changes here, move userId to int instead of username
@NonNull
@PrimaryKey(autoGenerate = true)
private int id;
@NonNull
@ColumnInfo(name = "Username")
private String username;
@ColumnInfo(name = "Email")
private String email;
@ColumnInfo(name = "Password")
private String password;
//getters setters.
这就是我的样子 RoomDatabase
class:
@Database(entities = {User.class}, version = 1)
public abstract class ApplicationDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
我的问题是,当我编辑实体时,如果我的 android 设备中的数据库发生变化?如果我的数据库中有数据怎么办?如果我需要先删除我设备上的数据库?我的用户构造器怎么样,它现在可以工作了吗?
感谢任何建议
编辑实体时需要更改数据库的版本,在这种情况下,将注释更改为@Database(entities = {User.class}, version = 2)
由您决定是要删除数据库的旧数据还是要将旧版本迁移到新版本(如果您有用户群而您没有,我会推荐它希望他们丢失数据库中保存的数据,否则我建议您删除旧数据库中的信息,因为这是更简单的解决方案。
如果您想进一步阅读有关迁移房间数据库的信息,我添加了 link:
https://developer.android.com/training/data-storage/room/migrating-db-versions
如您所述,删除和重新创建数据库没有任何问题。那么在这种情况下,只需将 fallbackToDestructiveMigration()
添加到您的 Room
数据库构建器中,例如:
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.fallbackToDestructiveMigration() //recreate DB in case of conflict due to cache/backup
.build();
这将在您更改数据库版本时重新创建所有表,从而丢失所有以前的数据。
如果您想在更新表的同时保留数据库中的旧数据,则需要使用 MIGRATIONS,例如:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
+ "`name` TEXT, PRIMARY KEY(`id`))");
}
};
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();
我有一个问题。我从这里编辑了我的房间实体:
@Entity(tableName = "users")
public class User {
public User(String username, String email, String password){
this.username = username;
this.email = email;
this.password = password;
}
public User() {}
@PrimaryKey
@ColumnInfo(name = "Username")
private String username;
@ColumnInfo(name = "Email")
private String email;
@ColumnInfo(name = "Password")
private String password;
//getters setters
到这个表格:
@Entity(tableName = "users")
public class User {
public User(String username, String email, String password){
this.username = username;
this.email = email;
this.password = password;
}
public User() {}
//changes here, move userId to int instead of username
@NonNull
@PrimaryKey(autoGenerate = true)
private int id;
@NonNull
@ColumnInfo(name = "Username")
private String username;
@ColumnInfo(name = "Email")
private String email;
@ColumnInfo(name = "Password")
private String password;
//getters setters.
这就是我的样子 RoomDatabase
class:
@Database(entities = {User.class}, version = 1)
public abstract class ApplicationDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
我的问题是,当我编辑实体时,如果我的 android 设备中的数据库发生变化?如果我的数据库中有数据怎么办?如果我需要先删除我设备上的数据库?我的用户构造器怎么样,它现在可以工作了吗?
感谢任何建议
编辑实体时需要更改数据库的版本,在这种情况下,将注释更改为@Database(entities = {User.class}, version = 2)
由您决定是要删除数据库的旧数据还是要将旧版本迁移到新版本(如果您有用户群而您没有,我会推荐它希望他们丢失数据库中保存的数据,否则我建议您删除旧数据库中的信息,因为这是更简单的解决方案。
如果您想进一步阅读有关迁移房间数据库的信息,我添加了 link:
https://developer.android.com/training/data-storage/room/migrating-db-versions
如您所述,删除和重新创建数据库没有任何问题。那么在这种情况下,只需将 fallbackToDestructiveMigration()
添加到您的 Room
数据库构建器中,例如:
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.fallbackToDestructiveMigration() //recreate DB in case of conflict due to cache/backup
.build();
这将在您更改数据库版本时重新创建所有表,从而丢失所有以前的数据。
如果您想在更新表的同时保留数据库中的旧数据,则需要使用 MIGRATIONS,例如:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
+ "`name` TEXT, PRIMARY KEY(`id`))");
}
};
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();