Ich habe zwei Tabellen: Spuren und Wegpunkte, eine Spur kann viele Wegpunkte haben, aber ein Wegpunkt ist nur einer Spur zugeordnet.
In der Wegpunktetabelle habe ich eine Spalte mit dem Namen "trackidfk", die die track_ID einfügt, sobald eine Spur erstellt wurde. Ich habe jedoch keine Fremdschlüsseleinschränkungen für diese Spalte eingerichtet.
Ist dies möglich, wenn ich eine Spur lösche, für die ich die zugewiesenen Wegpunkte löschen möchte? Ich habe über die Verwendung von Triggern gelesen, glaube aber nicht, dass sie in Android unterstützt werden.
So erstellen Sie die Wegpunkttabelle:
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"
+ " );"
);
...
}
quelle
PRAGMA
AnweisungenonConfigure()
, erfordert jedoch API-Level 16 (Android 4.1). Bis dahin können Sie einfach aufrufensetForeignKeyConstraintsEnabled
.onCreate
/onDowngrade
/onUpgrade
, die vor sindonOpen
. Siehe Quellcode in Android 4.1.1 .Seit Android 4.1 (API 16) unterstützt SQLiteDatabase :
quelle
Wie der Beitrag von e.shishkin ab API 16 besagt, sollten Sie Fremdschlüsseleinschränkungen in der
SqLiteOpenHelper.onConfigure(SqLiteDatabase)
Methode mithilfe von aktivierendb.setForeignKeyConstraintsEnabled(boolean)
quelle
Nie zu alt für eine Frage, um sie mit einer vollständigeren Antwort zu beantworten.
quelle
Was auch immer @phil erwähnt hat, ist gut. Sie können jedoch eine andere Standardmethode verwenden, die in der Datenbank selbst verfügbar ist, um den Fremdschlüssel festzulegen. Das ist setForeignKeyConstraintsEnabled (true).
Für Text & Tabellen beziehen SQLiteDatabase.setForeignKeyConstraintsEnabled
quelle
A good time to call this method is right after calling openOrCreateDatabase(File, SQLiteDatabase.CursorFactory) or in the onConfigure(SQLiteDatabase) callback.
Anstatt alsoonOpen
,onConfigure
scheint der richtige Ort zu sein.Ich glaube nicht, dass SQLite dies sofort unterstützt. Was ich in meinen Apps mache, ist:
Auf diese Weise bin ich sicher, dass entweder alle Daten gelöscht werden oder keine.
quelle
Trigger werden von Android unterstützt und diese Art der Kaskadenlöschung wird von SQLite nicht unterstützt. Ein Beispiel für die Verwendung von Triggern auf Android finden Sie hier . Die Verwendung von Transaktionen, wie Thorsten sagte, ist wahrscheinlich genauso einfach wie ein Auslöser.
quelle
Die SQLite-Version in Android 1.6 ist 3.5.9 und unterstützt daher keine Fremdschlüssel ...
http://www.sqlite.org/foreignkeys.html "Dieses Dokument beschreibt die Unterstützung für SQL-Fremdschlüsseleinschränkungen, die in SQLite Version 3.6.19 eingeführt wurden."
In Froyo ist es SQLite Version 3.6.22, also ...
BEARBEITEN: um die SQLite-Version zu sehen: adb shell sqlite3 -version
quelle
Fremdschlüssel mit "On Delete Cascade" werden in SQLite ab Android 2.2 unterstützt. Seien Sie jedoch vorsichtig, wenn Sie sie verwenden: Manchmal wird ein Fehler gemeldet, wenn ein Fremdschlüssel in einer Spalte ausgelöst wird. Das eigentliche Problem liegt jedoch entweder in einer anderen Spalten-Fremdschlüsseleinschränkung in der untergeordneten Tabelle oder in einer anderen Tabelle, die auf diese Tabelle verweist.
Anscheinend überprüft SQLite alle Einschränkungen, wenn eine davon gestartet wird. Es wird tatsächlich in der Dokumentation erwähnt. DDL- und DML-Einschränkungsprüfungen.
quelle
Wenn Sie Android Room verwenden, gehen Sie wie unten gezeigt vor.
quelle