Создание ограничений внешнего ключа в ORMLite под SQLite

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

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

3 ответа

Решение

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

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

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html

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

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

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

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

короче говоря, вы можете установить его как:

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

Таким образом, у Person есть внешний ключ для Organization, и ключ, который он использует в Organization, это "organization_id" .

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

Другие вопросы по тегам