Android SQLite - принудительное увеличение на столбце целых чисел - PullRequest
0 голосов
/ 02 апреля 2011

У меня есть таблица, в которой хранятся данные о топливе, используемом конкретным транспортным средством. Одним из столбцов является current_m Пробег. Можно ли как-то ограничить эту таблицу, чтобы она принимала только увеличивающиеся значения для этого столбца? То есть если строка 1 имеет значение 1000 в качестве current_milet, то значение current_milib в строке 2 должно быть 1001 или выше.

Большое спасибо, Barry

Ответы [ 4 ]

1 голос
/ 02 апреля 2011

Вы можете использовать триггер , чтобы применить это ограничение.

Вот пример, в котором предполагается, что ваша таблица называется FuelConsumption и содержит столбец vehicle_id (просто предположите, что вы захотите сохранить расход топлива более чем одним транспортным средством? пункт в части КОГДА):

CREATE TRIGGER trg_bi_FuelConsumption
BEFORE INSERT ON FuelConsumption
WHEN NEW.current_mileage <= (SELECT MAX(current_mileage) FROM FuelConsumption WHERE vehicle_id = NEW.vehicle_id)
BEGIN
    RAISE(ABORT, 'Fuel consumption cannot decrease');
END;

Я бы также посоветовал установить УНИКАЛЬНОЕ ограничение на комбинацию (vehicle_id, current_mileage). Это обеспечит создание индекса (тем самым значительно ускоряя часть КОГДА триггера) и будет перехватывать идентичные значения даже перед триггером.

Если вы не хотите добавлять ограничение UNIQUE, то по крайней мере добавьте (неуникальный) индекс к вашей таблице для этих двух столбцов.

0 голосов
/ 02 апреля 2011

Базы данных по сути ничего не знают о порядке строк, которые они хранят; это не часть теории о базах данных. Такая логика лучше обслуживается бизнес-правилами в вашем приложении.

0 голосов
/ 02 апреля 2011

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

Cursor c = db.rawQuery("SELECT current_mileage FROM table_name ORDER BY current_mileage DESC LIMIT 1");
c.moveToFirst();
int max = c.getInt(c.getColumnIndex("current_mileage"));

Затем вы должны убедиться, что следующая вставка должна содержать current_mileage, который больше max.

0 голосов
/ 02 апреля 2011

Почему бы не сделать current_mileage вашим первичным ключом?

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