Как я могу сбросить порядковый номер автоинкремента в sqlite - PullRequest
8 голосов
/ 07 апреля 2011

Как обновить таблицу sqlite_sequence в Ormlite? Мне просто нужно обновить Seq. Как я могу получить эту таблицу через ORMLite?

РЕДАКТИРОВАТЬ

Я не могу найти инструмент ORLite, чтобы сделать это, поэтому вместо этого я использую простой запрос sqlite. В моем классе распространяется OrmLiteSqliteOpenHelper, я использую SQLiteDatabase, чтобы сделать это обновление.

EDIT2;)

В моем проекте я сохранил класс Lesson и класс WeekDefinition.

class Lesson{
    @DatabaseField(generatedId=true)
    private int id;
    ...
}

class WeekDefinitions{
    @DatabaseField(generatedId=true)
    private int id;
    @DatabaseField(foreign=true, columnName="lesson_id")
    private Lesson lesson;
    ...
}

Теперь, когда я добавляю новые уроки, id увеличивается. Например

id = 1 Math
id = 2 English
id = 3 Medicine

и через неделю Определение:

id = 1 lesson_id = 1  nr = 20
id = 2 lesson_id = 1  nr = 22
id = 3 lesson_id = 2  nr = 32
...
id = 12 lesson_id = 3  nr = 3

SQLite добавляет эту строку в sqlite_sequence (при использовании автоинкремента)

rowId = 1   name = lesson         seq = 3
rowId = 2   name = weekDefinition seq = 12

Теперь я удаляю все строки из таблиц Lesson и WeekDefinition. После этого уроки и WeekDef будут пусты, но sqlite_sequence остается прежним. И это проблема, потому что идентификатор в табличном уроке начинается со значения 4 (следуйте из sqlite_sequence для урока и добавьте 1):

id = 4 Math
id = 5 English
id = 6 Medicine

и неделя определений

id = 13 lesson_id = 1  nr = 20
id = 14 lesson_id = 1  nr = 22
id = 15 lesson_id = 2  nr = 32

и для id урока = 4, по математике я должен получить weekDefinitios, но в weekDefinitions courses_id имеет значение только от 1 до 3 И это моя проблема. Мне нужно "сбросить" таблицу sqlite_sequence (или есть лучшее решение?)

Ответы [ 4 ]

20 голосов
/ 13 января 2013

Здание на Маркоса Васконселоса ответ :

UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"

Этот запрос установит для seq наибольшее значение в столбце идентификаторов col в таблице Tbl, поэтому риск нарушения ограничений отсутствует.

9 голосов
/ 08 апреля 2011

В вашем файле .db есть таблица с именем sqlite_sequence

В каждой строке есть два столбца name, которые являются именем таблицы seq целое число, указывающее текущее последнее значение в этой таблице

Вы можете обновить его до 0

Но будьте осторожны, если ваша таблица использует этот идентификатор в качестве уникального идентификатора.

2 голосов
/ 19 сентября 2016
UPDATE SQLITE_SEQUENCE SET SEQ= 'value' WHERE NAME='table_name';
1 голос
/ 08 апреля 2011

Если вы хотите вводить общие команды базы данных в ORMLite, вы можете использовать метод updateRaw.См. javadocs .Также есть executeRaw для других команд.

lessonDao.updateRaw("delete from 'lesson';");
lessonDao.updateRaw("delete from sqlite_sequence where name='lesson';");
weekDefinitionDao.updateRaw("delete from 'weekdefinition';");
weekDefinitionDao.updateRaw(
    "delete from sqlite_sequence where name='weekdefinition';");

Вы также можете удалить и заново создать таблицу:

TableUtils.dropTable(WeekDefinition.class);
TableUtils.dropTable(Lesson.class);
TableUtils.createTable(Lesson.class);
TableUtils.createTable(WeekDefinition.class);

Я думаю, что реальный вопрос заключается в том, почему ваше приложение зависитна этой базе внутренний номер?Это действительно не должно волновать.

  • Как насчет того, чтобы вообще не отображать число, чтобы оно могло быть 1 или 1001, и ваше приложение не будет иметь значения?
  • Вы также никогда не сможете удалитьуроки на всех, но, возможно, добавить скрытое логическое поле.Так что, если они будут добавлены повторно, скрытое поле может быть установлено в false, и Math все равно будет с идентификатором # 1.
...