私はAndroidSQLiteデータベースを使用しており、その中に2つのテーブルがあります。
TableCHECKPOINTS
は、Tableの属性への外部キーを定義しますTOUR
。
データベースにデータを保存した後、テーブルTour
は正しく表示されます。TOUR_ID
ただし、テーブル内の外部キーのある列CHECKPOINTS
は空白のままです。どうしてか分かりません。
構文は問題ないはずです。また、を設定しPRAGMA foreign_keys = ON;
ます。しばらく実験した後Trigger
、onCreate()
関数でaを定義しましたDatabaseHelper
。
しかし、今、私はエラーを受け取ります:
android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
。
DatabaseHelper:
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);
}