У меня есть следующие таблицы: // Решение отредактировано ниже!Android Sqlite Удалить связанные таблицы
Вы можете увидеть обобщение [непересекающихся, общее]. Когда я удаляю строку в отношении «Ziel», я хотел бы удалить связанную строку в связанной таблице.
Exampe с одной записью в Koerper-Ziel:
R (Зил) = {{1, 7, NULL, NULL, ...}}
R (Koerper-Зил) = {{ 7, ...}}
удалить (1) будут удалены обе записи^
SQLite код:
private static final String CREATE_TABLE_ZIELE_KOERPER = "CREATE TABLE " + TABLE_ZIELE_KOERPER + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_OPTION + " INTEGER, " +
COLUMN_TENDENZ + " INTEGER);";
private static final String CREATE_TABLE_ZIELE_CARDIO = "CREATE TABLE " + TABLE_ZIELE_CARDIO + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_EXTRA + " TEXT);";
private static final String CREATE_TABLE_ZIELE_TRAINING = "CREATE TABLE " + TABLE_ZIELE_TRAINING + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_EXTRA + " TEXT, " +
COLUMN_MUSKEL + " TEXT, " +
COLUMN_WIEDERHOLUNGEN + " INTEGER);";
private static final String CREATE_TABLE_ZIELE = "CREATE TABLE " + TABLE_ZIELE + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_ERSTELLDATUM + " LONG, " +
COLUMN_DEADLINE + " LONG, " +
COLUMN_DONE + " INTEGER, " +
COLUMN_VALUE + " FLOAT, " +
COLUMN_FORTSCHRITT + " FLOAT, " +
COLUMN_K_ID + " INTEGER, " +
COLUMN_C_ID + " INTEGER, " +
COLUMN_T_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_K_ID + ") REFERENCES " + TABLE_ZIELE_KOERPER + "(" + COLUMN_ID + ") ON DELETE CASCADE, " +
"FOREIGN KEY(" + COLUMN_C_ID + ") REFERENCES " + TABLE_ZIELE_CARDIO + "(" + COLUMN_ID + ") ON DELETE CASCADE, " +
"FOREIGN KEY(" + COLUMN_T_ID + ") REFERENCES " + TABLE_ZIELE_TRAINING + "(" + COLUMN_ID + ") ON DELETE CASCADE " +
");";
Но он не работает у и др. Я думаю, проблема в том, что DELETE ON CASCADE
работает только в обратном направлении. Как мне изменить код?
РЕДАКТИРОВАТЬ:
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
Добавление Koerperziel:
private long addKoerperziel(KoerperZiel ziel){
ContentValues values = new ContentValues();
SQLiteDatabase db = getWritableDatabase();
//Anlegen in der Relation TABLE_ZIELE_KOERPER
values.put(COLUMN_OPTION, ziel.getKoerperZielOption());
values.put(COLUMN_TENDENZ, ziel.getTendenz());
long kID = db.insert(TABLE_ZIELE_KOERPER, null, values);
//Anlegen in der Relation TABLE_ZIELE mit der kID als Fremdschluessel
values.clear();
values.put(COLUMN_K_ID, kID);
values.put(COLUMN_NAME, ziel.name);
values.put(COLUMN_ERSTELLDATUM, ziel.erstellDatum.getTime());
values.put(COLUMN_DEADLINE, ziel.deadline.getTime());
values.put(COLUMN_DONE, ziel.isDone());
values.put(COLUMN_VALUE, umrechnenKoerperZielValue1Add(ziel.getKoerperZielOption(), ziel.value));
values.put(COLUMN_FORTSCHRITT, ziel.progress);
return db.insert(TABLE_ZIELE, null, values);
}
EDIT 2:
private static final String CREATE_TABLE_ZIELE_KOERPER = "CREATE TABLE " + TABLE_ZIELE_KOERPER + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_OPTION + " INTEGER, " +
COLUMN_TENDENZ + " INTEGER, " +
COLUMN_Z_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_Z_ID + ") REFERENCES " + TABLE_ZIELE + "(" + COLUMN_ID + ") ON DELETE CASCADE" +
");";
private static final String CREATE_TABLE_ZIELE_CARDIO = "CREATE TABLE " + TABLE_ZIELE_CARDIO + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_EXTRA + " TEXT," +
COLUMN_Z_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_Z_ID + ") REFERENCES " + TABLE_ZIELE + "(" + COLUMN_ID + ") ON DELETE CASCADE" +
");";
private static final String CREATE_TABLE_ZIELE_TRAINING = "CREATE TABLE " + TABLE_ZIELE_TRAINING + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_EXTRA + " TEXT, " +
COLUMN_MUSKEL + " TEXT, " +
COLUMN_WIEDERHOLUNGEN + " INTEGER, " +
COLUMN_Z_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_Z_ID + ") REFERENCES " + TABLE_ZIELE + "(" + COLUMN_ID + ") ON DELETE CASCADE" +
");";
private static final String CREATE_TABLE_ZIELE = "CREATE TABLE " + TABLE_ZIELE + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_ERSTELLDATUM + " LONG, " +
COLUMN_DEADLINE + " LONG, " +
COLUMN_DONE + " INTEGER, " +
COLUMN_VALUE + " FLOAT, " +
COLUMN_FORTSCHRITT + " FLOAT);";
РЕШЕНИЕ
private static final String CREATE_TABLE_ZIELE_KOERPER = "CREATE TABLE " + TABLE_ZIELE_KOERPER + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_OPTION + " INTEGER, " +
COLUMN_TENDENZ + " INTEGER, " +
COLUMN_Z_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_Z_ID + ") REFERENCES " + TABLE_ZIELE + "(" + COLUMN_ID + ") ON DELETE CASCADE" +
");";
private static final String CREATE_TABLE_ZIELE_CARDIO = "CREATE TABLE " + TABLE_ZIELE_CARDIO + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_EXTRA + " TEXT," +
COLUMN_Z_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_Z_ID + ") REFERENCES " + TABLE_ZIELE + "(" + COLUMN_ID + ") ON DELETE CASCADE" +
");";
private static final String CREATE_TABLE_ZIELE_TRAINING = "CREATE TABLE " + TABLE_ZIELE_TRAINING + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_EXTRA + " TEXT, " +
COLUMN_MUSKEL + " TEXT, " +
COLUMN_WIEDERHOLUNGEN + " INTEGER, " +
COLUMN_Z_ID + " INTEGER, " +
"FOREIGN KEY(" + COLUMN_Z_ID + ") REFERENCES " + TABLE_ZIELE + "(" + COLUMN_ID + ") ON DELETE CASCADE" +
");";
private static final String CREATE_TABLE_ZIELE = "CREATE TABLE " + TABLE_ZIELE + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_ERSTELLDATUM + " LONG, " +
COLUMN_DEADLINE + " LONG, " +
COLUMN_DONE + " INTEGER, " +
COLUMN_VALUE + " FLOAT);";
Нет у меня есть, что в моем коде! – XxGoliathusxX
Хорошо, вы можете показать этот сегмент кода? – Zach
Хорошо добавил. В другом отношении работает удаление на каскаде. – XxGoliathusxX