Android / ORMLite Вставить строку с идентификатором - PullRequest
7 голосов
/ 16 августа 2011

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

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

Спасибо!

Ответы [ 2 ]

14 голосов
/ 16 августа 2011

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

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

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

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

4 голосов
/ 16 августа 2011

С http://ormlite.com/docs/generated-id:

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

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

...