Android SQLite数据库外键不起作用

时间:2012-08-09 17:59:16

标签: android sqlite foreign-keys

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

CHECKPOINTS定义表TOUR中属性的外键。

将数据存储到数据库后,正确显示表Tour。但是,表TOUR_ID中包含外键CHECKPOINTS的列仍为空白。我不知道为什么。

语法应该没问题,我也设置了PRAGMA foreign_keys = ON;。 经过一段时间的实验,我在Trigger的{​​{1}}函数中定义了onCreate()

但是,现在我得到一个错误:

DatabaseHelper

DatabaseHelper:

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

的DataSource:

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;"); } } 中插入:

TOUR

public long InsertTour(String name){ ContentValues values = new ContentValues(); values.put("NAME", name); return database.insert("TOUR", null, values); } 包含更多如上所述的数据。这是插入:

CHECKPOINT

1 个答案:

答案 0 :(得分:0)

有些难以分辨出什么是错的,因为你没有提供完整的细节,但是从你的答案中我认为你对外键有错误的概念而且你期望通过外键自动“填充 EM>”。

外键约束用于强制表之间的存在关系。也就是说,您将无法在checkpoint表格中插入tour_id tour行,而{{1}}行不存在。

http://www.sqlite.org/foreignkeys.html

了解详情