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"
+ " );"
);
...
}
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
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)
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);
}
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);
}
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
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:
- Utwórz transakcję
- Usuń szczegółowe dane (waypointy w twoim przykładzie)
- Usuń dane główne (ścieżki w twoim przykładzie)
- Zatwierdź transakcję na sukces
W ten sposób jestem pewien, że albo wszystkie dane zostaną usunięte, albo żadne.
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.
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
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.
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