9

次の単純なモデルを検討してください。

ベース Location テーブル:

+-------------------------------+
|           Locations           |
+-------------------------------+
|(PK) _id Integer Autoincrement |
|     name Text(100) Not null   |
|     is_in_range Integer       |
+-------------------------------+

そして、WifiLocation と呼ばれるより専門的なテーブル:

+-------------------------------+
|         wifi_location         |
+-------------------------------+
|     ssid Text(0) Not null     |
|     signal_threshold Real     |
|(PK) _id Integer               |
+-------------------------------+

WifiLocationこのモデルがからの継承を表すことを望みBaseLocationます。だから私はそのようなテーブルの列にREFERENCES節を追加しました:_idwifi_locations

CREATE TABLE wifi_locations (_id Integer primary key references Locations(_id), ....)

これらのテーブル間で 1:1 の関係を実現しようとしています。

テーブルに行を挿入する場合wifi_locations、まず適切な値 (Name、IsInRange) をLocationsテーブルに挿入し、rowId. 次に、残りのデータ (ssid) をwifi_locations、rowId を外部キーとしてテーブルに挿入します。

したがって、Location テーブルへの挿入は機能しており、ID を取得していますが、この ID を使用して wifi_locations テーブルに挿入しようとすると、SQLConstraint violationエラーが発生します。正確に何がうまくいかなかったのかについての詳細はありません。

私のスキーマに何か問題がありますか? そのようなモデリングを達成するためのより良い方法はありますか?

編集:

正確なエラー:

06-16 15:56:42.846: E/Database(2038):
android.database.sqlite.SQLiteConstraintException: 
error code 19: constraint failed
4

1 に答える 1

6

Locations テーブルFOREIGN KEYを参照して、2 番目のテーブルを作成する必要があります。PRIMARY KEYSQLite ではFOREIGN KEYSサポートされていますが、暗黙的に有効になっていないため、最初に有効にする必要があります。

final String ENABLE_FOREIGN_KEYS ="PRAGMA foreign_keys=ON";
db.execSQL(ENABLE_FOREIGN_KEYS);

onOpen()方法でSQLiteOpenHelper

次に、FOREIGN KEY次のようになります。

CREATE TABLE wifi_location (
   SSID TEXT NOT NULL,
   SIGNAL_THRESHOLD REAL,
   _id INTEGER,  
  FOREIGN KEY(_id) REFERENCES Locations(_id)
);

しかし、これはすべてSQLite version 3.6.19. 詳細については、SQLite 外部キー サポートを参照してください。

于 2012-06-16T17:27:30.663 に答える