===== Uso de bases de datos ===== A veces las tablas son demasiado grandes para poder meterlas en un único fichero, o bien se tiene acceso a un conjunto de dato estructurado en una base de datos. En este caso, en vez de usar la clase [[siette.util.corpus.Table]] se utiliza una subclase [[siette.util.corpus.DatabaseTable]] que permite acceder a la base de datos directamente. La ventaja y el inconveniente de usar bases de datos es que la información puede contenida puede cambiar dinámicamente, sin que Siette tenga conocimiento de esos cambios, por lo que las preguntas que se generarón a partir de una cierta semilla, pueden variar a lo largo del tiempo. ==== Ejemplo 1 ==== <% DatabaseTable db = new DatabaseTable("demo/bio/dbpedia.properties"); db.setPassword("*******"); db.setTableName("ANIMALES"); db.setKey("BINOMIAL"); db.addWhere("NOMBRE IS NOT NULL AND CLASSIS = 'Mammalia'"); String[] animal db.select(); String img = db.get( animal, "IMG" ); String binomial = db.get( animal, "BINOMIAL" ); String animal_name = db.get( animal, "NOMBRE" ); animal_name = new String (animal_name.getBytes(), "iso-8859-1"); ... %>

¿Que animal es éste?
Este ejemplo muestra el enunciado de una pregunta en la que se muetra la imagen de un animal y se pide su nombre. La base de datos de la que se obtiene la información se ha construido a partir de los datos existentes en la [[https://www.dbpedia.org/|dbpedia]], que se han almacenado localmente. Los datos de la conexión a la base de datos que contiene esta información se especifican en el fichero ''demo/bio/dbpedia.properties'', salvo la contraseña, que por razones de seguridad se establece mediante el método ''setPassword()'' en la propia pregunta. El contenido del fichero es el siguiente: dbms=postgres ip=192.168.169.140 puerto=5432 usuario=dbpedia sid=dbpedia Las siguientes instrucciones componen una sentencia ''SELECT'' del lenguaje [[wp>SQL|SQL]] mediante instrucciones que fijan el nombre de la tabla, el criterio de ordenación y la condición. Estos métodos auxiliares eximen al programador no experto en bases de datos de la necesidad de componer la sentencia ''SELECT'' manualmente. La sentencia resultante es la siguiente: SELECT * FROM ANIMALES WHERE NOMBRE IS NOT NULL AND CLASSIS = 'Mammalia' Una vez realizada la consulta, que se ejecuta al invocar al método ''select()'' el resto de la programación es similar al uso de [[tablas]]. El resultado tras instanciar esta plantilla es: {{ es:manual:items:item_generativo_basedatos_1.png }} Se puede hacer uso de los mmétodos de seleccion como ''selectSet'' y 'selectAll'' indicando los valores de los atributos que se quiera utilizar en la consulta y el sistema construye automaticamente la consulta SQL correspondiente. Por ejemplo: String[][] tabla = db.selectAll("CLASSIS", new String[] {"Mamalia", "Aves"}, Table.ANY, "HABITAT", new String[] {"Acuatico"}, Table.ANY); construirria la consulta: SELECT * FROM ANIMALES WHERE (CLASSIS = 'Mammalia' OR CLASSIS = 'Aves') AND NOT (HABITAT = 'Acuatico') en el caso de que la correspondencia fuera exacta, previa llamada a la función [[siette.util.corpus.table#setExactMatch]], o bien: SELECT * FROM ANIMALES WHERE (CLASSIS LIKE '%Mammalia%' OR CLASSIS LIKE '%Aves%') AND NOT (HABITAT LIKE '%Acuatico%') en caso de que se haya configurado la tabla con [[siette.util.corpus.table#setPartialMatch]]