Ograniczenia klucza obcego w Androidzie za pomocą SQLite? on Delete cascade

Mam dwie tabele: ścieżki i waypointy, ścieżka może mieć wiele waypointów, ale punkt jest przypisany tylko do 1 ścieżki.

W tabeli punktów drogi mam kolumnę o nazwie "trackidfk", która wstawia track_ID po utworzeniu ścieżki, jednak nie ustawiłem ograniczeń klucza obcego w tej kolumnie.

Kiedy usuwam utwór chcę usunąć przypisane waypointy, czy jest to możliwe?. Czytałem o używaniu wyzwalaczy, ale nie sądzę, że są one obsługiwane w Androidzie.

To Utwórz tabelę waypointów:

public void onCreate(SQLiteDatabase db) {
    db.execSQL( "CREATE TABLE " + TABLE_NAME 
                + " (" 
                + _ID         + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
                + LONGITUDE   + " INTEGER," 
                + LATITUDE    + " INTEGER," 
                + TIME        + " INTEGER,"
                + TRACK_ID_FK + " INTEGER"
                + " );"
              );

    ...
}
Author: rgamber, 2010-03-30

9 answers

Foreign key constraints with on delete cascade są obsługiwane, ale musisz je włączyć.
Właśnie dodałem następujący tekst do mojego SQLOpenHelper, który wydaje się działać.

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
}

Zadeklarowałem moją kolumnę odniesienia w następujący sposób.

mailbox_id INTEGER REFERENCES mailboxes ON DELETE CASCADE
 232
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 13:19:02

Od Androida 4.1 (API 16) sqlitedatabase obsługuje:

public void setForeignKeyConstraintsEnabled (boolean enable)
 52
Author: e.shishkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-27 20:17:39

Jak pisze post z E. shishkin z API 16 up powinieneś włączyć ograniczenia klucza obcego w metodzie SqLiteOpenHelper.onConfigure(SqLiteDatabase) używając metody db.setForeignKeyConstraintsEnabled(boolean)

@Override
public void onConfigure(SQLiteDatabase db){
    db.setForeignKeyConstraintsEnabled(true);
}
 25
Author: malcolm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 07:23:08

Nigdy nie jest za stary na pytanie, aby odpowiedzieć bardziej kompletną odpowiedzią.

@Override public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        setForeignKeyConstraintsEnabled(db);
    }
    mOpenHelperCallbacks.onOpen(mContext, db);
}

private void setForeignKeyConstraintsEnabled(SQLiteDatabase db) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        setForeignKeyConstraintsEnabledPreJellyBean(db);
    } else {
        setForeignKeyConstraintsEnabledPostJellyBean(db);
    }
}

private void setForeignKeyConstraintsEnabledPreJellyBean(SQLiteDatabase db) {
    db.execSQL("PRAGMA foreign_keys=ON;");
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void setForeignKeyConstraintsEnabledPostJellyBean(SQLiteDatabase db) {
    db.setForeignKeyConstraintsEnabled(true);
}
 9
Author: Codeversed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 02:10:38

Cokolwiek @ phil wspomniał jest dobre. Ale możesz użyć innej domyślnej metody dostępnej w Sama baza danych, aby ustawić foreignkey. Jest to setForeignKeyConstraintsEnabled (true).

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;"); 
              //(OR)
        db.setForeignKeyConstraintsEnabled (true)
    }
}

Dla dokumentów patrz sqlitedatabase.setForeignKeyConstraintsEnabled

 6
Author: anand krish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 19:33:05

Myślę, że SQLite nie obsługuje tego po wyjęciu z pudełka. To co robię w moich aplikacjach to:

  1. Utwórz transakcję
  2. Usuń szczegółowe dane (waypointy w twoim przykładzie)
  3. Usuń dane główne (ścieżki w twoim przykładzie)
  4. Zatwierdź transakcję na sukces

W ten sposób jestem pewien, że albo wszystkie dane zostaną usunięte, albo żadne.

 4
Author: Thorsten Dittmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-30 14:13:43

Wyzwalacze są obsługiwane przez Androida i ten typ kasowania kaskadowego nie jest obsługiwany przez sqlite. Przykład użycia wyzwalaczy na Androida można znaleźć tutaj . Chociaż korzystanie z transakcji, jak stwierdził Thorsten, jest prawdopodobnie tak proste, jak wyzwalacz.

 4
Author: Dave.B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-30 14:55:25

Wersja SQLite w Androidzie 1.6 to 3.5.9, więc nie obsługuje kluczy obcych...

Http://www.sqlite.org/foreignkeys.html "Ten dokument opisuje obsługę ograniczeń klucza obcego SQL wprowadzonych w SQLite w wersji 3.6.19."

W Froyo jest to wersja SQLite 3.6.22, więc..

Edytuj: aby zobaczyć wersję sqlite : adb shell sqlite3-version

 3
Author: GBouerat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 21:51:00

Klucze obce z "on delete cascade" są obsługiwane w SQLite w Androidzie 2.2 i nowszych. Ale bądź ostrożny przy ich używaniu: czasami zgłaszany jest błąd podczas uruchamiania jednego klucza obcego w jednej kolumnie, ale prawdziwy problem polega albo na ograniczeniu klucza obcego w innej kolumnie w tabeli podrzędnej, albo na jakiejś innej tabeli, do której thet odwołuje się.

Wygląda na to, że SQLite sprawdza wszystkie ograniczenia podczas odpalania jednego z nich. W rzeczywistości jest to wspomniane w dokumentacji. Ograniczenie DDL a DML czeki.

 1
Author: Yar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 10:29:11