【问题标题】:Room database - edit entities房间数据库 - 编辑实体
【发布时间】:2019-01-26 15:30:20
【问题描述】:

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

@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 班级的样子:

@Database(entities = {User.class}, version = 1)
public abstract class ApplicationDatabase extends RoomDatabase {

public abstract UserDao userDao();
}

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

感谢您的建议

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您想进一步了解迁移房间数据库的信息,我添加了一个链接:

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

    【讨论】:

    • 我可以删除所有数据库。你能告诉我,怎么做吗?
    • 您可以重新安装应用程序,如果您是唯一使用该应用程序的人,它将被删除。
    • 或者你可以创建一个方法来删除所有用户,如果版本更新@Query("DELETE FROM User") void deleteAll();
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多