【问题标题】:Android SQLite Database Foreign Key Does Not WorkAndroid SQLite 数据库外键不起作用
【发布时间】:2012-08-11 04:31:37
【问题描述】:

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

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

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

语法应该没问题,我还设置了PRAGMA foreign_keys = ON;。 经过一段时间的试验,我在DatabaseHelperonCreate() 函数中定义了一个Trigger

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

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 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;");
    } 
}

有没有人知道如何让这件事发生?

编辑:

插入表格TOUR

    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);
}

【问题讨论】:

  • 全部实现了。我编辑了这个问题。
  • 1) 为什么在有 2 列的 CHECKPOINT 中插入 4 个值? 2)你为什么使用不存在的列名? 3) 你期望发生什么?
  • ... 如前所述:“表 CHECKPOINT 包含比上述更多的数据”。它实际上具有列 ID、TOUR_ID、COLUMN1、COLUMN2、COLUMN3、COLUMN4。 ID 是自动递增的,TOUR_ID 应该通过外键填充。我只是在发布之前缩短了代码。

标签: android sqlite foreign-keys


【解决方案1】:

很难判断出了什么问题,因为您没有提供完整的详细信息,但从您的回答中,我认为您对外键有错误的概念,并且您期望某些内容会自动“通过外键填充 em>”。

外键约束用于强制表之间的存在关系。也就是说,您将无法插入具有tour_idcheckpoint 行,而tour 表中不存在该行。

阅读更多http://www.sqlite.org/foreignkeys.html

【讨论】:

  • 是的,我认为你是对的。我误解了一些东西。感谢分享链接,我会仔细阅读!
猜你喜欢
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多