会议室数据库-编辑实体

时间:2019-01-26 15:30:21

标签: java android android-room android-database android-jetpack

我有一个问题。我从这里编辑了房间实体:

if (path.Contains('|'))
   path = path.Split('|')[1];

此表单:

@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

我的问题是,当我编辑实体时,我的android设备中的数据库是否更改?如果我的数据库中有数据怎么办?如果我需要先在设备上删除数据库?那我的用户构造函数呢,现在可以使用了吗?

谢谢您的建议

2 个答案:

答案 0 :(得分:1)

在编辑实体时,需要更改数据库的版本,在这种情况下,请将注释更改为@Database(entities = {User.class},version = 2)

由您决定是要删除数据库的旧数据还是要将旧版本迁移到较新的版本(如果您有用户群并且不希望使用它们,我建议您这样做丢失其保存在数据库中的数据,否则,我建议您将信息删除到旧数据库中,因为这是更简单的解决方案)。

如果您想进一步了解如何迁移会议室数据库,我添加了一个链接:

https://developer.android.com/training/data-storage/room/migrating-db-versions

答案 1 :(得分:1)

正如您所提到的,删除和重新创建数据库没有任何问题。然后,在这种情况下,只需将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();