Создайте триггер, используя базу данных комнаты (библиотека сохраняемости комнаты)

Как «Создать триггер» с помощью библиотеки Room Persistence

CREATE TRIGGER  IF NOT EXISTS delete_till_10 INSERT ON user WHEN (select count(*) from user)>9

BEGIN 

    DELETE FROM user WHERE id IN  (SELECT id FROM user ORDER BY id limit (select count(*) -9 from user));

END

person Vishal    schedule 11.08.2017    source источник
comment
Room абстрагирует необработанный SQL. Вы должны обрабатывать объекты.   -  person CL.    schedule 11.08.2017


Ответы (1)


Позвоните getOpenHelper() на свой RoomDatabase. Это дает вам SupportSQLiteOpenHelper, API которого напоминает SQLiteOpenHelper. Там вызовите getWritableDatabase(), чтобы получить SupportSQLiteDatabase, а там используйте execSQL() для выполнения ваших операторов SQL. RoomDatabase.Callback — это одно из мест для выполнения такого рода SQL, как показывает AdamMc331 в этом фрагменте Kotlin.

IOW, Room на самом деле не помогает в этом сценарии, но вы всегда можете работать с API базы данных более низкого уровня для таких случаев, как этот.

person CommonsWare    schedule 11.08.2017
comment
Есть ли у вас какие-либо рекомендации о том, когда мы должны это сделать? Триггеры можно создать только один раз, поэтому я предполагаю, что делать это в миграции комнаты — это хорошо, но хотелось бы узнать ваше мнение. - person AdamMc331; 16.09.2017
comment
Однако, добавляя, даже если я сделал это при миграции, где я должен определить триггер, чтобы он применялся при первой установке приложения? - person AdamMc331; 16.09.2017
comment
@ AdamMc331: я не знаю, как выполнить миграцию для первоначального создания базы данных. Таким образом, хотя вам нужно будет использовать миграцию для обновления существующего приложения, вам нужно будет сделать это в другом месте для первоначального создания. Это может быть вариант использования для RoomDatabase.Callback ; вы бы создали триггер в onCreate(). Вы подключаете Callback через addCallbacks() к RoomDatabase.Builder. - person CommonsWare; 16.09.2017
comment
@CommonsWare Спасибо, это именно то, что мне было нужно. Я только что проверил кратко и выглядит великолепно. Я поместил соответствующий код в суть для всех, кто может наткнуться на это, не стесняйтесь добавлять его в свой ответ - gist.github.com/AdamMc331/5d48220875ce6b8bf0a0c0396ec8a0c0 - person AdamMc331; 16.09.2017