Создание ограничений внешнего ключа в ORMLite под SQLite - PullRequest
12 голосов
/ 22 мая 2011

Поскольку невозможно добавить внешние ключи с помощью инструкции «ALTER TABLE» в SQLite, я застрял в том, как настроить мою базу данных для принудительного применения допустимых внешних ключей или выполнить каскадное удаление без явных накладных расходов кода.

Кто-нибудь получил идею, как сделать это с ORMLite под SQLite?

Ответы [ 3 ]

22 голосов
/ 10 мая 2012

Чтобы развить удивительный ответ Грея (для всех, кто сталкивается с этим вопросом), вы можете использовать аннотацию 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 ).

7 голосов
/ 24 мая 2011

как настроить мою базу данных для принудительного применения допустимых внешних ключей или выполнения каскадного удаления без явных накладных расходов кода.

ORMLite поддерживает поле columnDefinition="..." в аннотации @DatabaseFiled @Timo. Я не уверен, дает ли он вам необходимую мощность, но он позволяет вам иметь собственные определения столбцов.

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()

Если этого не произойдет, то я боюсь, что в этом случае вам, возможно, придется создавать свою базу данных вне ORMLite . Вы можете использовать TableUtils.getCreateTableStatements(), чтобы получить операторы, необходимые для создания таблицы, и добавить нужные вам операторы принудительного и каскадного операторов. Вот javadocs для этого метода .

0 голосов
/ 20 февраля 2014

Я думаю, что следующая ссылка может быть полезной:

http://mueller.panopticdev.com/2011/03/ormlite-and-android.html

, вы можете установить ее следующим образом:

public class Person {
...
@DatabaseField(columnName = "organization_id", canBeNull = false)
private Organization m_organization;

Таким образом, человек имеетвнешний ключ для Организации, и ключ, который он использует в Организации, - это "имя_организации".

Надеюсь, это поможет.

...