如何在Android上的SQLite数据库中实现“inheritance”关系

考虑这个简单的模型:

基本位置表:

+-------------------------------+ | 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 | +-------------------------------+ 

我希望这个模型将代表从WifiLocationinheritanceBaseLocation 。 所以我在wifi_locations表的_id列上添加了一个REFERENCES子句:

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

我试图实现这些表之间的1:1关系。

当我想向wifi_locations表中插入一行时,首先将相应的值(Name,IsInRange)插入到Locations表中,并取回rowId 。 然后我将其余的数据(ssid)连同rowId作为外键一起插入到wifi_locations表中。

所以插入到位置表正在工作,我回来一个ID,但是当我尝试使用此ID并将其插入到wifi_locations表,我得到一个SQL Constraint violation错误。 没有关于究竟发生了什么问题的更多细节。

我的模式有什么问题吗? 有没有更好的方法来实现这种build模?

编辑:

确切的错误:

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

Solutions Collecting From Web of "如何在Android上的SQLite数据库中实现“inheritance”关系"

您应该在第二个表格中创buildFOREIGN KEY ,并在位置表格中引用PRIMARY KEY 。 在SQLite 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外键支持 。