Android / ORMLite Вставить строку с идентификатором

В настоящее время я использую ORMLite для работы с базой данных SQLite на Android. В рамках этого я загружаю кучу данных с внутреннего сервера, и я хотел бы, чтобы эти данные добавлялись в базу данных SQLite в том же формате, что и на внутреннем сервере (т.е. идентификаторы совпадают и т. Д.) .

Итак, мой вопрос к вам: заполню ли я объект записи моей базы данных (мы назовем его Equipment), включая поле сгенерированного Id / первичного ключа оборудования через setId (), а затем я запускаю DAO.create () с этой записью оборудования. что ID сохранится правильно? Я пробовал вот так и мне кажется, что это не так. Если это так, я попробую еще раз и поищу другие проблемы, но после первых нескольких проходов кода я не смог найти ни одной. По сути, если я вызываю DAO.create () для объекта базы данных с установленным идентификатором, этот идентификатор будет отправлен в базу данных, а если нет, как я могу вставить строку с уже заполненным значением первичного ключа?

Спасибо!


person jmif    schedule 16.08.2011    source источник


Ответы (2)


@Femi правильно, что объект может быть либо сгенерированным идентификатором , либо идентификатором, но не обоими. Проблема не только в том, как ORMLite хранит объект, но и в том, что он должен соответствовать схеме, по которой была создана база данных.

ORMLite поддерживает allowGeneratedIdInsert=true параметр @DatabaseField аннотации, который позволяет такое поведение. Это не поддерживается некоторыми типами баз данных (например, Derby), но работает под Android / SQLite.

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

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

person Gray    schedule 16.08.2011

Из http://ormlite.com/docs/generated-id:

Логическое значение, указывающее, является ли поле автоматически созданным полем идентификатора. По умолчанию - false. Только одно поле может иметь это значение в классе. Это указывает базе данных автоматически генерировать соответствующий идентификатор для каждой вставленной строки. Когда объект со сгенерированным идентификатором создается с помощью метода Dao.create (), база данных сгенерирует идентификатор для строки, который будет возвращен и установлен в объекте методом создания. Некоторым базам данных требуются последовательности для сгенерированных идентификаторов, и в этом случае имя последовательности будет автоматически сгенерировано. Чтобы указать имя последовательности, используйте generateIdSequence. Можно указать только одно из значений this, id и generatedIdSequence.

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

person Femi    schedule 16.08.2011
comment
Я прочитал это, но предположил, что смогу ввести и свой собственный идентификатор, потому что в других базах данных я могу ВСТАВИТЬ с идентификатором, даже если он имеет автоматически сгенерированный первичный ключ. Это что-то специфическое для настройки ORMLite или, может быть, баз данных SQLite? - person jmif; 16.08.2011
comment
Это относится к ORMLite: см. ormlite.svn.sourceforge.net/viewvc/ormlite/ormlite-core/trunk/, строка 32. Вы заметите, что это автоматически назначает идентификатор для параметров generatedId или generatedIdSequence, не проверяя, установлено ли уже значение. Если вы используете SQLite, вы можете просто записать в базу данных вручную, а затем перезагрузить с помощью ORMLite или добавить отдельный столбец для идентификатора базы данных сервера (что я и делаю, хотя я не использую ORMLite). - person Femi; 16.08.2011