Создание ограничений внешнего ключа в ORMLite в SQLite
Как нельзя добавить внешние ключи с помощью инструкции "ALTER TABLE" в SQLite, я зациклился на том, как настроить мою базу данных для принудительного ввода действительных внешних ключей или выполнить каскадные удаления без явных служебных данных кода.
Кто-нибудь понял, как это сделать с ORMLite в SQLite?
Ответы
Ответ 1
как настроить мою базу данных для принудительного ввода действительных внешних ключей или выполнить каскадные удаления без явных служебных данных кода.
ORMLite поддерживает поле columnDefinition="..."
в аннотации @DatabaseFiled
@Timo. Я не уверен, что он предоставляет вам необходимую вам мощность, но он позволяет вам создавать пользовательские определения столбцов.
http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()
Если это не так, я боюсь, что вам, возможно, придется создать свою базу данных вне ORMLite в этом случае. Вы можете использовать TableUtils.getCreateTableStatements()
, чтобы получить инструкции, необходимые для создания таблицы, и добавить необходимые вам принудительные и каскадные утверждения. Ниже приведены javadocs для этого метода.
Ответ 2
Чтобы рассказать о Серьезном ответе (для любого другого, кто наткнулся на этот вопрос), вы можете использовать аннотацию columnDefinition
для определения ограничения внешнего ключа и каскадного удаления.
Во-первых, ограничения внешнего ключа были добавлены в SQLite в 3.6.19, а это значит, что вы можете использовать их в Android 2.2 или выше (начиная с версии 2.2 поставляется с SQLite 3.6.22). Однако ограничения внешнего ключа не включены по умолчанию. Чтобы включить их, используйте технику этот ответ.
Здесь приведен пример аннотации columnDefinition
. Это предполагает, что ваш стол/объект, на который вы ссылаетесь, называется parent
, у которого есть первичный ключ id
.
@DatabaseField(foreign = true,
columnDefinition = "integer references parent(id) on delete cascade")
private Parent parent;
Обратите внимание, что формат для значения String не включает имя столбца (что означает аннотация columnName).
Ответ 3
Я думаю, что следующая ссылка может быть полезна:
http://mueller.panopticdev.com/2011/03/ormlite-and-android.html
вы можете установить его как:
public class Person {
...
@DatabaseField(columnName = "organization_id", canBeNull = false)
private Organization m_organization;
Таким образом, у человека есть внешний ключ для организации, а ключ, который он использует для организации, - "organization_id".
Надеюсь, что это поможет.