Создание ограничений внешнего ключа в 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" .
Надеюсь это поможет.