varias usar una tipos tablas studio proyectos propia para nuestra hacer guardar datos crear consultas con como android sqlite triggers android-sqlite

android - usar - ¿Cómo manejar los disparadores de sqlite que se basan en nombres/columnas de tabla modificados?



tipos de datos sqlite android (2)

SQLite se diseñó como una base de datos integrada, para ser utilizada junto con un lenguaje de programación ''real''.

Por lo tanto, no tiene ningún mecanismo incorporado para crear SQL dinámico. En particular, los nombres de las tablas no se pueden cambiar dinámicamente, sino que se deben escribir literalmente en cada declaración SQL, y todos los nombres de las tablas se mencionan en una declaración cuando la declaración se compila (cuando realmente se usa el desencadenador).

Digamos que tengo estas 2 tablas y disparo:

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;

Ahora, supongamos que mi aplicación de Android cambió la segunda tabla (agregó una columna o cambió su nombre a new_second_table ). ¡Ahora First_table_trigger falla indefinidamente ! ¿Cómo manejaré esto desde la base de datos sql sin tener que lidiar con esto en el código de la aplicación?

Quiero decir, ¿puedo adivinar dinámicamente el nombre de la segunda tabla o sus columnas con en el first_table_trigger ?

Necesito ayuda en soluciones solo desde sql / triggers, no desde el código por favor :)

Muchas gracias.


Si tiene la capacidad de copiar la base de datos a una herramienta de administración de SQLite como SQLite Manager, que creo que requeriría un dispositivo rooteado, o si la aplicación tiene un medio integrado de realizar una copia de seguridad de la base de datos en una ubicación de almacenamiento accesible y tener el capacidad de restaurar la base de datos a partir de copias de seguridad en esa ubicación de almacenamiento.

Luego puede modificar manualmente la base de datos en la herramienta de administración SQLite después de copiarla, por ejemplo DROP y luego CREAR el activador y luego copiar la base de datos en el dispositivo a la ubicación original de la base de datos si el dispositivo está rooteado o a la ubicación de almacenamiento accesible. una aplicación que tiene capacidad de respaldo y restauración.

Por ejemplo, suponiendo que se usa el Android Device Monitor de Android Studio y un paquete mjt.so46027137 con una base de datos llamada todo.db, la base de datos se puede extraer de la siguiente manera:

En esta captura de pantalla, se han agregado 2 activadores y el primero ha sido seleccionado para su eliminación:

Los cambios pueden ser retrocedidos, por ejemplo:

Ejecutando lo siguiente: -

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); }

que muestra los datos extraídos de la tabla sqlite_master muestra los dos desencadenantes (en realidad, no eliminé el desencadenador): -

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

lo que confirma que los disparadores se han agregado.

El ejemplo anterior se realizó con un dispositivo Genymotion (emulado).