Android SQLite数据库外键不起作用
我正在使用Android SQLite数据库,其中有两个表 表Android SQLite数据库外键不起作用,android,sqlite,foreign-keys,Android,Sqlite,Foreign Keys,我正在使用Android SQLite数据库,其中有两个表 表CHECKPOINTS定义了表TOUR中属性的外键 将数据存储到数据库后,表Tour将正确显示。但是,表CHECKPOINTS中带有外键TOUR\u ID的列仍为空。我不知道为什么 语法应该是正确的,我还设置了PRAGMA-foreign\u-keys=ON。 经过一段时间的实验后,我在我的DatabaseHelper的onCreate()函数中定义了一个触发器 但是,现在我得到一个错误: android.database.Curso
CHECKPOINTS
定义了表TOUR
中属性的外键
将数据存储到数据库后,表Tour
将正确显示。但是,表CHECKPOINTS
中带有外键TOUR\u ID
的列仍为空。我不知道为什么
语法应该是正确的,我还设置了PRAGMA-foreign\u-keys=ON代码>。
经过一段时间的实验后,我在我的DatabaseHelper
的onCreate()
函数中定义了一个触发器
但是,现在我得到一个错误:
android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0
数据库助手:
private static final String TABLE_CREATE_TOUR = "create table TOUR("
+ " ID integer primary key autoincrement, "
+ " NAME varchar(20)) ";
private static final String TABLE_CREATE_CHECKPOINT = "create table CHECKPOINT("
+ " ID integer primary key autoincrement, "
+ " TOUR_ID integer not null, "
+ " FOREIGN KEY (TOUR_ID) REFERENCES TOUR(ID)) ";
public void onCreate(SQLiteDatabase database) {
database.execSQL(TABLE_CREATE_TOUR);
database.execSQL(TABLE_CREATE_CHECKPOINT);
database.execSQL("CREATE TRIGGER fk_checkpoint_tourid BEFORE INSERT ON CHECKPOINT "
+ " FOR EACH ROW BEGIN "
+ " SELECT CASE WHEN ((SELECT ID FROM TOUR WHERE ID = new.TOUR_ID ) IS NULL) "
+ " THEN RAISE (ABORT, 'Foreign Key Violation') END; "
+ " END;");
}
数据源:
public void open() throws SQLException {
database = dbhelper.getWritableDatabase();
// Enable foreign key constraints
if (!database.isReadOnly()) {
database.execSQL("PRAGMA foreign_keys = ON;");
}
}
有没有人有办法让这件事继续下去
编辑:
在表中插入巡更
:
public long InsertTour(String name){
ContentValues values = new ContentValues();
values.put("NAME", name);
return database.insert("TOUR", null, values);
}
表CHECKPOINT
包含更多如上所述的数据。以下是插页:
public Entry createEntry(String PARAM1, String PARAM2, long PARAM3, String PARAM4) {
ContentValues values = new ContentValues();
values.put("COLUMN1", PARAM1);
values.put("COLUMN2", PARAM2);
values.put("COLUMN3", PARAM3);
values.put("COLUMN4", PARAM4);
long insertId = database.insert("CHECKPOINT", null, values);
Cursor cursor = database.query("CHECKPOINT", allColumns, "ID = " + insertId, null, null, null, null);
cursor.moveToFirst();
return cursorToEntry(cursor);
}
因为你没有给出完整的细节,所以很难判断出什么是错的,但从你的回答来看,我认为你对外键的概念是错误的,你期望一些东西会自动“通过外键填充”
外键约束用于强制表之间存在的关系。也就是说,您将无法插入具有巡更id的检查点
行,该行在巡更
表中不存在
阅读更多信息,请访问,它已全部实施。我编辑了这个问题。1)当检查点有两列时,为什么要在其中插入4个值?2) 为什么使用不存在的列名?3) 你期望发生什么事?。。。正如所说:“表检查点包含的数据比上面描述的要多”。它实际上有列ID、巡更ID、列1、列2、列3、列4。ID是自动递增的,巡更ID应该通过外键填充。我只是在发布之前缩短了代码。是的,我想你是对的。我误解了什么。谢谢分享链接,我会仔细阅读的!