2016-08-23 2 views
2

У меня есть следующие таблицы: // Решение отредактировано ниже!Android Sqlite Удалить связанные таблицы

Exampe

Вы можете увидеть обобщение [непересекающихся, общее]. Когда я удаляю строку в отношении «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);"; 

ответ

1

В случае удаления каскада удаляется только в случае удаления записи в удаленной таблице. Таким образом, чтобы получить эффект каскада, либо удалите его из таблиц KID, CID, TID, либо если вы хотите удалить из таблицы ZIEL и каскадом, переместите ограничения внешнего ключа в таблицы KID, CID, TID;

Я бы также рекомендовал изменить схему, чтобы каждый из таблиц KID, CID, TID имел идентификатор ZIEL, который избавлялся бы от необходимости нулевых значений KID, CID или TID в таблице ZIEL.

Это, как я хотел бы изменить вашу схему (на основании того, что я знаю о том, что вы пытаетесь сделать)

TABLE_ZIELE

COLUMN_ID, COLUMN_NAME, COLUMN_ERSTELLDATUM, COLUMN_DEADLINE, COLUMN_DONE, COLUMN_VALUE, COLUMN_FORTSCHRITT 

TABLE_ZIELE_KOERPER

COLUMN_ID, COLUMN_OPTION, COLUMN_TENDENZ, ZIEL_ID -> FOREIGN KEY(ZIEL_ID) REFERENCES ZIEL(COLUMN_ID) 

TABLE_ZIELE_CARDIO

COLUMN_ID, COLUMN_EXTRA, ZIEL_ID -> FOREIGN KEY(ZIEL_ID) REFERENCES ZIEL(COLUMN_ID) 
не

TABLE_ZIELE_TRAINING

COLUMN_ID, COLUMN_EXTRA, COLUMN_MUSKEL, COLUMN_WIEDERHOLUNGEN, ZIEL_ID -> FOREIGN KEY(ZIEL_ID) REFERENCES ZIEL(COLUMN_ID) 

Теперь, если удалить из TABLE_ZIEL будет каскадом и удалить запись в соответствующей KOERPER, Кардио или ТРЕНИНГ стол

+0

Нет у меня есть, что в моем коде! – XxGoliathusxX

+0

Хорошо, вы можете показать этот сегмент кода? – Zach

+0

Хорошо добавил. В другом отношении работает удаление на каскаде. – XxGoliathusxX

Смежные вопросы