android - trigger - sqlite update




Wie geht man mit sqlite-Triggern um, die auf geänderten Tabellennamen/-spalten basieren? (2)

SQLite wurde als eingebettete Datenbank entwickelt, die zusammen mit einer "echten" Programmiersprache verwendet werden kann.

Daher verfügt es über keinen integrierten Mechanismus zum Erstellen von dynamischem SQL. Insbesondere können Tabellennamen nicht dynamisch geändert werden, sondern müssen in jeder SQL-Anweisung wörtlich geschrieben werden, und alle Tabellennamen, die in einer Anweisung erwähnt werden, müssen vorhanden sein, wenn die Anweisung kompiliert wird (wenn der Trigger tatsächlich verwendet wird).

Sagen wir, ich habe diese 2 Tabellen und triggern:

CREATE TABLE first_table (
 `text` TEXT,
 `num`  INTEGER,
 `id`   INTEGER
);

CREATE TABLE second_table (
 `text` TEXT,
 `num`  INTEGER,
 `id`   INTEGER
);

CREATE TRIGGER first_table_trigger AFTER INSERT ON first_table
BEGIN
INSERT INTO second_table VALUES('NEW LINE', new.num, new.id);
END;

Nehmen wir nun an, dass meine Android-Anwendung die second_table geändert hat (eine Spalte hinzugefügt oder ihren Namen in new_second_table ). Jetzt failed first_table_trigger auf unbestimmte Zeit ! Wie werde ich das aus der SQL-Datenbank handhaben, ohne dass ich damit im App-Code umgehen muss.

Ich meine, kann ich den zweiten Tabellennamen oder seine Spalten mit dem first_table_trigger dynamisch erraten?

Ich brauche Hilfe zu Lösungen nur von den sql / triggern, nicht vom Code bitte :)

Danke vielmals.


Wenn Sie die Möglichkeit haben, die Datenbank in ein SQLite Management Tool wie SQLite Manager zu kopieren, was meiner Meinung nach ein gerootetes Gerät erfordern würde, oder dass die App ein eingebautes Mittel hat, die Datenbank an einem zugänglichen Speicherort zu sichern und zusätzlich die Möglichkeit, die Datenbank aus Sicherungen an diesem Speicherort wiederherzustellen.

Dann könnten Sie die Datenbank im SQLite-Management-Tool nach dem Kopieren z. B. DROP manuell anpassen und dann den Trigger CREATE erstellen und die Datenbank anschließend entweder an den ursprünglichen Speicherort der Datenbank zurück auf das Gerät kopieren, wenn das Gerät gerootet ist oder den zugreifbaren Speicherort verwendet eine App, die über Sicherungs- und Wiederherstellungsfunktionen verfügt.

Wenn Sie zum Beispiel den Android Device Monitor von Android Studio und ein Paket mjt.so46027137 mit einer Datenbank namens todo.db verwenden, kann die Datenbank wie folgt abgerufen werden:

In diesem Screenshot wurden 2 Trigger hinzugefügt und der erste zum Löschen ausgewählt:

Die Änderungen können dann zurückgeschoben werden zB: -

Ausführen der folgenden: -

    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    Cursor csr = db.rawQuery("SELECT * FROM sqlite_master",null);
    while (csr.moveToNext()) {
        Log.d("SQLITEMASTER","Row=" + csr.getPosition());
        String sqlmstr = "";
        for (int i=0; i < csr.getColumnCount(); i++) {
            sqlmstr = sqlmstr + "\n\t" + "Column=" + csr.getColumnName(i) + " Data in Column=" + csr.getString(i);
        }
        Log.d("SQLITEMASTER", sqlmstr);
    }

Die Ausgabe von Daten aus der Tabelle sqlite_master zeigt die zwei Trigger (Ich habe den Trigger nicht wirklich gelöscht): -

09-06 17:25:56.791 25300-25300/? D/SQLITEMASTER: Row=0
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=table
                                                    Column=name Data in Column=android_metadata
                                                    Column=tbl_name Data in Column=android_metadata
                                                    Column=rootpage Data in Column=3
                                                    Column=sql Data in Column=CREATE TABLE android_metadata (locale TEXT)
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=1
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=table
                                                    Column=name Data in Column=student
                                                    Column=tbl_name Data in Column=student
                                                    Column=rootpage Data in Column=4
                                                    Column=sql Data in Column=CREATE TABLE student(_id INTEGER PRIMARY KEY AUTOINCREMENT, todo TEXT)
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=2
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=table
                                                    Column=name Data in Column=sqlite_sequence
                                                    Column=tbl_name Data in Column=sqlite_sequence
                                                    Column=rootpage Data in Column=5
                                                    Column=sql Data in Column=CREATE TABLE sqlite_sequence(name,seq)
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=3
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=trigger
                                                    Column=name Data in Column=test001
                                                    Column=tbl_name Data in Column=student
                                                    Column=rootpage Data in Column=0
                                                    Column=sql Data in Column=CREATE TRIGGER "test001" AFTER INSERT ON "student" BEGIN INSERT INTO student VALUES('ghost'); END
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=4
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=trigger
                                                    Column=name Data in Column=test002
                                                    Column=tbl_name Data in Column=student
                                                    Column=rootpage Data in Column=0
                                                    Column=sql Data in Column=CREATE TRIGGER "test002" AFTER INSERT ON "student" BEGIN Insert INTO student VALUES('ghost2'); END

Dies bestätigt, dass die Trigger hinzugefügt wurden.

Das obige Beispiel wurde mit einem Genymotion (emuliert) Gerät gemacht.







android-sqlite