Как изменить таблицу и добавить onDelete каскадное ограничение sqlite - PullRequest
0 голосов
/ 09 сентября 2018

Я использую базу данных номеров. У меня есть таблица, в которую я забыл добавить onDelete = CASCADE

Предыдущая версия

@Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id"))

Что я хочу сейчас

@Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id", onDelete = CASCADE))

Я пытаюсь перенести базу данных

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("What should I do here to add onDelete = CASCADE");
        }
    };

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

SQLite не полностью поддерживает стандарт SQL ALTER TABLE:

Только варианты RENAME TABLE, ADD COLUMN и RENAME COLUMN для Команда ALTER TABLE поддерживается. Другие виды ALTER TABLE такие операции, как DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT и т. д. далее опущены.

Источник

Таким образом, единственный способ добавить ограничение - воссоздать таблицу и скопировать данные старого в новый:

// 1. Rename your table
database.execSQL("ALTER TABLE Entity RENAME TO Entity_old")
// 2. Recreate the same entity, but now with the constraint
database.execSQL("""
    CREATE TABLE Entity(
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
        parentId INTEGER, 
        someField STRING, 
        CONSTRAINT fk_Entity_entityId_EntityParent_id FOREIGN KEY (entityId) REFERENCES EntityParent(id) ON DELETE CASCADE
    )
""")
// 3. Copy the data from the old table
database.execSQL("INSERT INTO Entity SELECT * FROM Entity_old")
// 4. Delete old table
database.execSQL("DROP TABLE Entity_old")
// 5. Recreate the indices
database.execSQL("CREATE INDEX index_Entity_id ON Entity(id)")
0 голосов
/ 09 сентября 2018

Хорошо, наконец, я нашел решение

database.execSQL("CREATE TABLE attendance_temp(attendanceId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, time INTEGER NOT NULL, student_id INTEGER, student_name TEXT , roll_number INTEGER, image_path TEXT, info_id INTEGER, present INTEGER , CONSTRAINT fk_class_info FOREIGN KEY (info_id) REFERENCES class_info(id) ON DELETE CASCADE)");
database.execSQL("INSERT INTO attendance_temp SELECT * FROM Attendance");
database.execSQL("DROP TABLE Attendance");
database.execSQL("ALTER TABLE attendance_temp RENAME TO Attendance");
database.execSQL("CREATE INDEX index_Attendance_info_id ON Attendance(info_id)");

Также измените схему в классе сущности на

@Entity(indices = {@Index(value = {"info_id"})}, foreignKeys = @ForeignKey(entity = StudentClass.class, parentColumns = "id", childColumns = "info_id", onDelete = CASCADE))

Последовательность важна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...