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

我正在使用Android SQLite数据库,其中有两个表

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应该通过外键填充。我只是在发布之前缩短了代码。是的,我想你是对的。我误解了什么。谢谢分享链接,我会仔细阅读的!