База данных номеров - редактирование объектов - PullRequest
0 голосов
/ 26 января 2019

У меня есть вопрос. Я отредактировал свою сущность Room из этого:

@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? Что если у меня есть данные в моей базе данных? Если мне нужно сначала удалить базу данных на моем устройстве? А как насчет моего конструктора для пользователя, теперь он будет работать?

Спасибо за любые советы

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Как вы упомянули, у вас нет проблем при удалении и воссоздании вашей базы данных.Тогда в этом случае просто добавьте fallbackToDestructiveMigration() в ваш Room db builder, например:

Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
            .fallbackToDestructiveMigration()       //recreate DB in case of conflict due to cache/backup
            .build();

. Это позволит воссоздать все таблицы при повышении версии базы данных, потеряв все ваши предыдущие данные.

Если вы хотите обновить таблицы при сохранении старых данных в базе данных, вам нужно будет использовать МИГРАЦИИ , например:

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();
0 голосов
/ 26 января 2019

Когда вы редактируете свои сущности, вам необходимо изменить версию базы данных, в этом случае измените аннотацию на @Database (entity = {User.class}, version = 2)

Это вверхвам решать, хотите ли вы удалить старые данные вашей базы данных или вы хотите перенести старую версию в новую (я бы порекомендовал это, если у вас есть база пользователей, и вы не хотите, чтобы они потеряли свои сохраненные данные вв противном случае я бы порекомендовал вам удалить информацию из старой базы данных, потому что это более простое решение).

Если вы хотите узнать больше о переносе базы данных вашей комнаты, я добавил ссылку:

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

...