Комната, как установить 'notnull value поля' является ложным? - PullRequest
0 голосов
/ 11 октября 2018

Я хочу добавить новый столбец в моей базе данных, используя комнату.Я использую миграцию 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;

Любой способ решить эту проблему, пожалуйста, помогите мне.Огромное спасибо.Извиняюсь за любую ошибку грамматики.

1 Ответ

0 голосов
/ 12 октября 2018

Я наконец нашел решение для этого.Добавляя «DEFAULT someValue» после «... ADD COLUMN column_name» в команде SQL.Это заставляет мое поле иметь значение по умолчанию, которое соответствует ожидаемой информации таблицы.т.е.:

sql.execSQL("ALTER TABLE table_name ADD COLUMN column_name INTEGER DEFAULT 1 not null")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...