После создания триггера через обратный вызов в комнате db, триггер не создается - PullRequest
0 голосов
/ 10 октября 2019

Я попытался добавить триггер, чтобы ограничить количество строк в моей комнате БД,

, но триггер не создается - как я вижу в БД и в сгенерированном файле JSON, который автоматически создается.

Кроме того, код миграции также не достигается.

Мой код для создания БД:

@Database(entities ={Sensor.class, Meter.class, MeterHistory.class, SensorHistory.class,
        ConnectivityHistory.class, GraphTypesHistory.class,
        SensorSettingsHistory.class, UserInterfaceSettings.class, Temperature.class, LogSettingsHistory.class, BatteryUsage.class,
        FunctionsHistory.class, MathChannelData.class}, version = 5)
@TypeConverters(UserUsageManager.DateConverter.class)
public abstract class UserUsageDB extends RoomDatabase {
    public abstract UserUsageDao userUsageDao();
    private static volatile UserUsageDB userUsageDBInstance;//singleton

    static UserUsageDB getDatabase(final Context context) {
        if (userUsageDBInstance == null) {
            synchronized (UserUsageDB.class) {
                if  (userUsageDBInstance == null) {
                    userUsageDBInstance = Room.databaseBuilder(context.getApplicationContext(),
                            UserUsageDB.class,  "user_usage_database")
                            .addCallback(LIMIT_CALLBACK)
                            .addMigrations(MIGRATION_1_2)
                            .fallbackToDestructiveMigration()
                            .build();
                }
            }
        }
        return userUsageDBInstance;
    }

и код миграции и обратного вызова триггера:

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        // Create the new meters table
        database.execSQL("CREATE TABLE meters_new ( id TEXT NOT NULL, name TEXT NOT NULL, PRIMARY KEY(id))");
        // Copy the data
        database.execSQL("INSERT INTO meters_new ( id, name) SELECT id, name FROM meters");
        // Remove the old table
        database.execSQL("DROP TABLE meters");
        // Change the table name to the correct one
        database.execSQL("ALTER TABLE meters_new RENAME TO meters");

        // Create the new sensors table
        database.execSQL("CREATE TABLE sensors_new (id TEXT NOT NULL, name TEXT NOT NULL, type TEXT NOT NULL, PRIMARY KEY(id))");
        // Copy the data
        database.execSQL("INSERT INTO sensors_new ( id, name) SELECT id, name FROM sensors");
        // Remove the old table
        database.execSQL("DROP TABLE sensors");
        // Change the table name to the correct one
        database.execSQL("ALTER TABLE sensors_new RENAME TO sensors");
    }
};

//create a trigger to limit row count of tables
static final RoomDatabase.Callback LIMIT_CALLBACK =  new RoomDatabase.Callback(){
    @Override
    public void onCreate(@NonNull SupportSQLiteDatabase db) {
        super.onCreate(db);
        db.execSQL("Create Trigger IF NOT EXISTS Trigr_Limit_battery_usage_Delete \n" +
                "AFTER Insert On battery_usage \n" +
                "   BEGIN \n"+
                "       DELETE from battery_usage\n"+
                "       where ts in (select ts  from battery_usage order by date limit -1 offset 10);"+
                "   END");

        db.execSQL("Create Trigger IF NOT EXISTS Trigr_Limit_sensor_settings_history_Delete \n" +
                "AFTER Insert On sensor_settings_history \n" +
                "   BEGIN \n"+
                "       DELETE from sensor_settings_history\n"+
                "       where ts in (select ts  from sensor_settings_history order by date limit -1 offset 10);"+
                "   END");
    }

    @Override
    public void onOpen(@NonNull SupportSQLiteDatabase db) {
        super.onOpen(db);
    }
};

Кто-нибудь может мне помочь? Спасибо !!

1 Ответ

1 голос
/ 10 октября 2019

но триггер не создается

Вы переопределяете метод onCreate, он вызывается только при фактическом создании базы данных (при первой установке приложения). Вы хотите переопределить метод onOpen , чтобы добавить триггеры.

Код миграции также не достигается.

Миграция из версии 1до 2 согласно (new Migration(1, 2)), у вас есть версия 5, закодированная в приложении согласно version = 5. Ваша миграция будет вызвана только тогда, когда версия, хранящаяся в базе данных, равна 1, а версия, закодированная в приложении, равна 2. Вы можете найти Понимание миграции с помощью Room полезным. Или, может быть, Базы данных Migrating Room

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