13

SQLite で「ALTER TABLE」ステートメントを使用して外部キーを追加することはできないため、有効な外部キーを強制するようにデータベースを構成する方法、または明示的なコード オーバーヘッドなしでカスケード削除を実行する方法に行き詰まっています。

SQLite の下で ORMLite を使用してこれを達成する方法を知っている人はいますか?

4

3 に答える 3

22

グレイの素晴らしい答え (この質問に出くわした他の人のために) を詳しく説明するには、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アノテーションの目的です)。

于 2012-05-10T16:28:45.950 に答える
7

有効な外部キーを適用するようにデータベースを構成する方法、または明示的なコード オーバーヘッドなしでカスケード削除を実行する方法。

ORMLite は、アノテーション @TimoのcolumnDefinition="..."フィールドをサポートしています。@DatabaseFiled必要な機能が提供されるかどうかはわかりませんが、カスタムの列定義を使用できます。

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

そうでない場合は、この場合、 ORMLiteの外部でデータベースを作成する必要があるかもしれません。を使用TableUtils.getCreateTableStatements()して、テーブルの作成に必要なステートメントを取得し、必要な強制およびカスケード ステートメントを追加できます。そのメソッドの javadoc は次のとおりです。

于 2011-05-24T12:06:47.423 に答える