1

私はAndroidSQLiteデータベースを使用しており、その中に2つのテーブルがあります。

TableCHECKPOINTSは、Tableの属性への外部キーを定義しますTOUR

データベースにデータを保存した後、テーブルTourは正しく表示されます。TOUR_IDただし、テーブル内の外部キーのある列CHECKPOINTSは空白のままです。どうしてか分かりません。

構文は問題ないはずです。また、を設定しPRAGMA foreign_keys = ON;ます。しばらく実験した後TriggeronCreate()関数で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);
}
4

1 に答える 1

0

完全な詳細を提供していないため、何が問題なのかを判断するのは少し難しいですが、あなたの回答から、外部キーについて間違った概念を持っていると思います.「外部キーを介して自動的に入力される」.

外部キー制約は、テーブル間の既存の関係を強制するために使用されます。つまり、テーブルに存在しないcheckpointを持つ行を挿入することはできません。tour_idtour

詳細については、http://www.sqlite.org/foreignkeys.htmlを参照してください。

于 2012-08-10T20:31:37.617 に答える