【发布时间】:2012-08-11 04:31:37
【问题描述】:
我正在使用 Android SQLite 数据库,其中有两个表。
表CHECKPOINTS 定义了表TOUR 中属性的外键。
将数据存储到数据库后,表Tour 会正确显示。但是,表CHECKPOINTS 中具有外键TOUR_ID 的列保持空白。我不知道为什么。
语法应该没问题,我还设置了PRAGMA foreign_keys = ON;。
经过一段时间的试验,我在DatabaseHelper 的onCreate() 函数中定义了一个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