2014-11-10 2 views
0

Я использую ORMLite в своем приложении для Android и много искал, но у меня нет четкого способа делать то, что я хочу. Я хотел бы знать, могу ли я изменить начальное значение сгенерированного значения. Например, теперь он начинается с 1, и я хотел бы начать с 010001 или 020001. Я заметил, что внутри таблицы sqlite_sequence. Должен ли я изменить это значение или я должен сделать это по-другому ?.ORMLite change generatedId value

спасибо!

ответ

1

Например теперь начинается в 1, и я хотел бы начать в 010001 или 020001.

В общем я беру мнение, что вы должны не сделать что-то вроде этого. Поле id предназначено для идентификации, и ваше приложение не должно зависеть от значений, являющихся чем-то конкретным.

Если вам нужно определенное количество, то я бы сгенерировал его извне в базу данных и добавил его как другое поле для элементов. Таким образом, id может плавать и быть тем, что хочет БД, и вы можете иметь свой специальный идентификатор, которым вы управляете.

+1

Я считаю это правильным, потому что после этого объяснения я буду использовать основной первичный ключ с двумя полями. Большое спасибо! – acostela

0

Вы должны иметь AUTO_INCREMENT = 0100001; в CREATE TABLE, но поскольку это, безусловно, сгенерированный код ORMLite, вам придется принудительно его использовать с помощью аннотации ORMLite.

@DatabaseField(generatedId = true, 
    columnDefinition = "INTEGER PRIMARY KEY AUTOINCREMENT = 0100001") 
private int id; 
+0

Благодарим за отзыв. Вы уверены, что это работает? потому что я получаю исключение из-за неверного выражения SQL. Я прочитал, что «INTEGER PRIMARY KEY» автоматически установит автоинкремент. Так что, возможно, именно по этой причине я получаю свое исключение. «AUTO_INCREMENT»: синтаксическая ошибка (код 1): при компиляции: CREATE TABLE 'lineavent' (' articulo' VARCHAR, 'hora' VARCHAR,' cliente' INTEGER, 'caja' INTEGER,' _id' INTEGER PRIMARY KEY AUTO_INCREMENT = 0100001, 'kilo' FLOAT,' partida' INTEGER, 'precio' FLOAT) – acostela

+0

Извините, нет. Я экстраполировал два разных ответа. http://stackoverflow.com/a/2130646/233048 и https://groups.google.com/forum/#!topic/ormlite-user/TxnpaBnJdhc – mach

+1

Я пытаюсь вставить явную строку в свою БД с помощью определенное значение для идентификатора, поэтому SQLlite будет использовать числа, превышающие их. Но сгенерированоId = true; не позволяет мне это делать. Я читал, что здесь http://stackoverflow.com/questions/692856/set-start-value-for-autoincrement-in-sqlite – acostela

0

Наконец-то я решил. Вот трюк:

@DatabaseField(allowGeneratedIdInsert = true, generatedId = true, columnName = ID) 
private int id; 

Я позволяю generatedIdInsert так что я могу установить вручную мой Id и если я не генерировать его вручную будет генерироваться автоматически. После этого я делаю первую явную вставку.

daoObject.setId(010000); 
dao.create(daoObject); 

Теперь, когда я вставить новый объект, generatedId начнется 010001.

Я надеюсь, что этот маленький трюк помочь кому-то.

+0

Я действительно не думаю, что это сработает. Ты это пробовал? – Gray

+0

Да, я на самом деле использую его, и он работает нормально. Почему вы думаете, что это неправильно? – acostela

+0

Это чрезвычайно зависит от базы данных. Это, конечно, не будет работать (например) postgres или mysql. Вы используете деталь Sqlite для реализации, который может вас укусить. См. Мой ответ. Например, вы видели это: «AUTOINCREMENT гарантирует, что автоматически выбранные ROWID будут увеличиваться, но не то, что они будут последовательными». https://www.sqlite.org/autoinc.html – Gray