2010-09-18 25 views
6

Quiero forzar una clave extranjera constarint en una tabla en una aplicación de Android.Disparadores SQLite en Android?

He buscado en que esto se puede hacer mediante el uso de disparadores:

lo hice así:

db.execSQL("CREATE TRIGGER dept_id_trigger22+" + 
       " AFTER INSERT "+ 
       " OF EmployeeName ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " RAISE(ABORT,'error') END;"); 

pero criaron sin error y se insertan los valores ilegales.

¿Qué pasa con esto?

+0

que no tienen el código aquí, pero un disparador básica trabajó para mí en SQLite y (según mis pruebas unitarias) se trabajado en todas las versiones de Android. –

+0

¿crees que mi código es correcto o falta algo? –

+0

Cualquiera que esté buscando la sintaxis del gatillo con el ejemplo de implementación en android. http://www.coderconsole.com/2015/02/android-sqlite-trigger-demo.html – nitesh

Respuesta

6

Ok lo tengo

Android es compatible con disparadores SQLite.

La sintaxis correcta es

db.execSQL("CREATE TRIGGER dept_id_trigger22" + 
       " AFTER INSERT "+ 
       "ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " SELECT RAISE(ABORT,'error'); END;"); 

me olvidó añadir punto y coma después de la sentencia raise.

Esto no ejecuta la declaración, pero no arroja una excepción. todavía habrá buscar cómo lanzar excepciones

gracias

0

Descubrí que la versión SQLite utilizada no es compatible con claves externas, por lo que espero que los desencadenadores no sean compatibles.

+0

gracias por su ayuda, pero ¿me puede dar alguna referencia sobre este tema? –

+0

Creo que su suposición es incorrecta porque lo hace support triggers –

+0

Parece que sí. Lo busqué, y por lo que leo, creo que estas características están disponibles, pero no se activan por defecto. Todavía no sé cómo utilizar los desencadenadores, pero hay un método interesante en la clase SQLiteDatabase llamado markTableSyncable (String table, String foreignKey, String updateTable) que tal vez sea lo que quieres: http://developer.android.com/ reference/android/database/sqlite/SQLiteDatabase.html # markTableSyncable% 28java.lang.String,% 20java.lang.String,% 20java.lang.String% 29 – mreichelt

1

no espero ningún voto para esta respuesta, sólo para hacerle saber:

Se puede usar otra base de datos, por ejemplo, el H2 database. Descargo de responsabilidad: soy el autor principal de H2.

Existen algunas desventajas: algunas (no todas) las operaciones son más lentas, por ejemplo, abrir y cerrar una base de datos. El archivo jar es relativamente grande (alrededor de 1 MB). Deberías usar la API de JDBC.

Pero la ventaja es: H2 admite el uso de desencadenantes, restricciones, etc.

+0

Gracias Thomas consideraré su uso. –

+0

Probablemente debería agregar: según mis pruebas (limitadas), algunas operaciones son más rápidas y otras mucho más lentas. Estoy trabajando en eso, y puedes esperar que el rendimiento de H2 en Android mejore en los próximos meses. También quiero implementar las API de Android para que el cambio de SQLite a H2 sea más fácil. –

3

Las claves externas sólo se admiten en el Android Froyo (2.2) o posterior, para las versiones anteriores puede incluirlas pero SQLite los ignora. Sin embargo, todas las versiones de Android de SQLite admiten desencadenantes para producir el mismo efecto.

Las versiones más nuevas de SQLite (para su PC) tienen un comando llamado "genfkey" que analizará su base de datos SQLite (que tiene claves foráneas) y producirá los disparadores equivalentes. De esta forma, puede diseñar sus tablas con restricciones de clave externa al mismo tiempo que admite todas las versiones del sistema operativo.

En Windows, abra la herramienta de línea de comandos SQLite con su archivo de base de datos como un parámetro:

sqlite3 mydatabase.db 
.genfkey --exec 

Esto va a generar disparadores para todas sus principales limitaciones.

1

para eliminar el último 50 filas cuando el número es mayor que 100

sqliteDB.execSQL("CREATE TRIGGER IF NOT EXISTS delete_trigger 
    AFTER INSERT ON table1 
    WHEN (SELECT COUNT(*) FROM table1) > 50 " + 
    BEGIN 
     delete From table1 where id not in(select id from table1 order by id desc limit 100; 
    END;" 
);