9

考虑这个简单的模型:

基本位置表:

+-------------------------------+
|           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引用。PRIMARY KEY在 SQLiteFOREIGN 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 Foreign Key Support

于 2012-06-16T17:27:30.663 回答