SQLite で「ALTER TABLE」ステートメントを使用して外部キーを追加することはできないため、有効な外部キーを強制するようにデータベースを構成する方法、または明示的なコード オーバーヘッドなしでカスケード削除を実行する方法に行き詰まっています。
SQLite の下で ORMLite を使用してこれを達成する方法を知っている人はいますか?
グレイの素晴らしい答え (この質問に出くわした他の人のために) を詳しく説明するには、columnDefinition
注釈を使用して外部キー制約とカスケード削除を定義できます。
まず、外部キー制約は 3.6.19 で SQLite に追加されました。これは、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アノテーションの目的です)。
有効な外部キーを適用するようにデータベースを構成する方法、または明示的なコード オーバーヘッドなしでカスケード削除を実行する方法。
ORMLite は、アノテーション @TimoのcolumnDefinition="..."
フィールドをサポートしています。@DatabaseFiled
必要な機能が提供されるかどうかはわかりませんが、カスタムの列定義を使用できます。
http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#columnDefinition()
そうでない場合は、この場合、 ORMLiteの外部でデータベースを作成する必要があるかもしれません。を使用TableUtils.getCreateTableStatements()
して、テーブルの作成に必要なステートメントを取得し、必要な強制およびカスケード ステートメントを追加できます。そのメソッドの javadoc は次のとおりです。