Я хочу добавить новый столбец в моей базе данных, используя комнату.Я использую миграцию Room для переноса моей базы данных в новую версию, но она не работает должным образом.Значение по умолчанию, равное значению поля INTERGER, истинно, для меня это действительно проблема.Пожалуйста, помогите мне.Я застрял в нем на много часов.
У меня есть класс Location.
package com.example.phamf.javamvvmapp.Model;
import ...
@Entity (tableName = "location")
public class Location {
@PrimaryKey(autoGenerate = true)
private int id;
private float x;
private float y;
private String name;
public Location(int id, float x, float y, String name) {
this.id = id;
this.x = x;
this.y = y;
this.name = name;
}
public Location () {
}
// Getter and setter
}
Я хочу добавить новое поле с именем type, его тип - INTEGER, поэтому я изменяю свое LocationФайл .java выше как
package com.example.phamf.javamvvmapp.Model;
import ...
@Entity (tableName = "location")
public class Location {
@PrimaryKey(autoGenerate = true)
private int id;
private int type;
private float x;
private float y;
private String name;
public Location(int id, float x, float y, String name, int type) {
this.id = id;
this.x = x;
this.y = y;
this.name = name;
this.type = type;
}
public Location () {
}
// Getter and setter
}
Вот мой класс RoomDatabase.
@Database(entities = {Location.class}, version = 2)
public abstract class LocationRoomDatabase extends RoomDatabase {
private static LocationRoomDatabase DATABASE;
public static LocationRoomDatabase getDatabase (final Context context) {
Migration migration = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE location ADD type INTEGER");
}
};
if (DATABASE == null) {
DATABASE = Room.databaseBuilder(context, LocationRoomDatabase.class, "database")
.addMigrations(migration).build();
}
return DATABASE;
}
public abstract LocationDAO locationDAO();
}
Проблема в том, что когда я запускаю код выше, я получаю ошибку
//...
Caused by: java.lang.IllegalStateException:
Migration didn't properly handle location(com.example.phamf.javamvvmapp.Model.Location).
Expected:
TableInfo{..., type=Column{name='type', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, foreignKeys=[], indices=[]}
Found:
TableInfo{..., type=Column{name='type', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
//...
Единственное отличие между Expected TableInfo и Found TableInfo - это значение notNull.Ожидаемый хочет, чтобы это было правдой, но Найденный не делает.Я понял, что проблемы были прямо здесь, поэтому я изменил свой код миграции
Migration migration = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE location ADD type INTEGER not null");
}
};
Я думал, что он будет отлично работать, но затем я получил ошибку
Caused by: android.database.sqlite.SQLiteException: Cannot add a NOT NULL column with default value NULL (code 1 SQLITE_ERROR): , while compiling: ALTER TABLE location ADD type INTEGER not null
Я также попытался добавить значение по умолчаниюв поле 'type', но оно тоже не работает
private int type = 0;
Любой способ решить эту проблему, пожалуйста, помогите мне.Огромное спасибо.Извиняюсь за любую ошибку грамматики.