[Gvsig_desarrolladores] Crear tabla en gvSIG a partir de datos consultados de BD MySQL

Jaime Traver revartj en gmail.com
Jue Ago 2 12:26:31 CEST 2007


Hola,

Una posible solucion seria crear una nueva tabla, a la cual le añadas los
datos de la capa y de la tabla de la base de datos.
Te muestro como hacer la tabla y añadirla al proyecto.

public class OperacionesTablas {

    private DBFDriver driver = new DBFDriver();
    private DataSourceFactory dsf;
    private DataSource dataSource = null;
    private SelectableDataSource sds;
    private EditableAdapter auxea;
    private DefaultRow row;
    private String nameProject;
    /**
     *
     */
    public OperacionesTablas(){

    }
    /**
     * @param tableList
     */
    public OperacionesTablas(ArrayList tableList){
        this.tableList=tableList;
    }
    /**
     * @param nameProject  --> nombre del archivo *.dbf
     * @param path --> Ruta donde quieres guardar el archivo *.dbf
     * @param Campos
     * @param fieldTypes
     */
    public void CrearTabla(String nameProject,String path , String[]
Campos,int [] fieldTypes ){
        this.nameProject=nameProject;
        dsf = LayerFactory.getDataSourceFactory();
        dsf.createFileDataSource(driver.getName(), nameProject, path+".dbf",
Campos, fieldTypes);
        try {
            dataSource = dsf.createRandomDataSource(nameProject,
DataSourceFactory.AUTOMATIC_OPENING);
            dataSource.setDataSourceFactory(dsf);
            sds = new SelectableDataSource(dataSource);
            auxea = new EditableAdapter();
            auxea.setOriginalDataSource(sds);
        } catch (DriverLoadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchTableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (DriverException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param valor
     */
    public void AniadirRow(Value[] valor){
        row = new DefaultRow(valor);
        try {
            auxea.addRow(row, "description", EditionEvent.ALPHANUMERIC);

        } catch (DriverIOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param tableList
     * @return  tableNames
     */
    public String[] getTableNames() {
        String[] tableNames = new String[tableList.size()];
        for (int i=0;i<tableList.size();i++) {
            tableNames[i] = ((ProjectTable)tableList.get(i)).getName();
        }
        return tableNames;
    }

    /**
     * @return auxea.getRecordset()
     */
    public SelectableDataSource getConjuntoResgistros(){
        return    auxea.getRecordset();
    }
    /**
     * @return nameProject
     */
    public String getNombreTablaEnProyecto(){
        return nameProject;
    }
    /**
     * @return auxea
     */
    public EditableAdapter getDatosTabla(){
        return auxea;
    }
}

public class OperacionesProyectoTabla {

    private ProjectTable projectTables;

    /**
     *
     */
    public OperacionesProyectoTabla(){
        projectTables=null;
    }
    /**
     * @param capa
     */
    public void AssociatedTableCapa(OperacionesTablas
OperationTable,AlphanumericData capa)
    {
        AniadirTablaProject(OperationTable);
        projectTables.setAssociatedTable(capa);
    }
    /**
     * @throws EditionException
     * @throws DriverLoadException
     * @throws DriverException
     */
    private void writeFile(OperacionesTablas OperationTable) throws
EditionException,DriverLoadException, DriverException{
                IEditableSource ies = projectTables.getModelo();
                IWriteable w = (IWriteable) ies;
                IWriter writer = w.getWriter();
                ITableDefinition tableDef = ies.getTableDefinition();
                writer.initialize(tableDef);
                ies.stopEdition(writer,EditionEvent.ALPHANUMERIC);

                OperationTable.getDatosTabla().getSelection().clear();
    }
    /**
     * @param OperationTable
     */
    public void AniadirTablaProject(OperacionesTablas OperationTable){
        try {
            projectTables = ProjectFactory.createTable(
OperationTable.getNombreTablaEnProyecto(),OperationTable.getDatosTabla());
            ProjectExtension ext =
(ProjectExtension)PluginServices.getExtension(ProjectExtension.class);
            ext.getProject().addDocument(projectTables);
            writeFile(OperationTable);
        } catch (DriverLoadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (EditionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (DriverException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param NombreTabla
     * @param tableList
     */
    public void setProyectoTabla(String NombreTabla, ArrayList tableList){
        for (int i=0;i<tableList.size();i++) {
            if
(((ProjectTable)tableList.get(i)).getName().equals(NombreTabla)) {
                projectTables = (ProjectTable)tableList.get(i);
                break;
            }
        }
    }
    /**
     * @return
     */
    public ProjectTable getProjectTable() {
        return projectTables;
    }
}

Una vez añadidas estas dos clases que te muestro en tu proyecto, tendrias
que hacer lo siguiente en tu programa principal:

    private OperacionesTablas operationTable;
    private OperacionesProyectoTabla operationProjectTable;


        operationTable = new OperacionesTablas();
        operationProjectTable = new OperacionesProyectoTabla();
        String[] field= {"CAMPO_A","CAMPO_B","CAMPO_C","CAMPO_D","CAMPO_E"};
        int [] fieldType={12,12,12,12,12};

        operationTable.CrearTabla("NOMBRE_TABLA","DIRECTORIO_DONDE_SE_ALOJARA_ARCHIVO.DBF",
field,fieldType); // Ej: Windows -> c:\misdocumentos\ficherosdf\ ; Linux -->
/home/tu_usuario/

        for (int i=0; i< 5; i++) // Desde 0 hasta 5, para que veas el
resultado
        {
            Value[] valor = new StringValue[5];
            valor[0]=ValueFactory.createValue("STRING_CAMPO_A");
            valor[1]=ValueFactory.createValue("STRING_CAMPO_B");
            valor[2]=ValueFactory.createValue("STRING_CAMPO_C");
            valor[3]=ValueFactory.createValue("STRING_CAMPO_D");
            valor[4]=ValueFactory.createValue(i"STRING_CAMPO_E");
            operationTable.AniadirRow(valor);

        }
        operationProjectTable.AniadirTablaProject(operationTable);



Creo que no se me ha pasado nada. Espero que te sirva de ayuda.

Un Saludo

El día 2/08/07, Javier López <jlopezviso en gmail.com> escribió:
>
> Hola,
>
> Planteo una nueva pregunta, ya algo diferente al hilo anterior. Lo que
> quiero ahora es crear una tabla en el proyecto cuando consulte datos de una
> BBDD MySQL y hacer la union de la tabla asociada a la capa con ésta. Pero
> aquí tengo el problema, ayer me llevé toda la tarde intentando crear la
> tabla (resultante de una consulta a la BBDD MySQL) y no fuí capaz, porque no
> encontraba el driver. Pongo el código a continuación:
>
>         Connection conn = GestorConexiones.getConnection();
>
>         System.out.println(conn.isClosed());
>
>         String name = "mi_tabla";
>         String driverInfo=" com.mysql.jdbc.Driver"; //"gdbms dbf
> driver";//"com.mysql.jdbc.Driver";
>
>         //Tiene que ser un new Driver, pq con el driver del dbf (el
> comentado) no falla pero no encuentra la tabla
>
>         System.out.println(driverInfo);
>
>         //ConcreteMemoryDriver driver = new ConcreteMemoryDriver();
>         //LayerFactory.getDataSourceFactory().getd
>
>         LayerFactory.getDataSourceFactory ().addDBDataSourceBySQL(name,
> conn, "select * from encuesta", driverInfo);
>
>         System.out.println("LLEGA");
>
>         DataSource dataSource = LayerFactory.getDataSourceFactory().createRandomDataSource(name,
> DataSourceFactory.AUTOMATIC_OPENING);
>
>         System.out.println("NO LLEGA");
>
>            SelectableDataSource sds = new
> SelectableDataSource(dataSource);
>         EditableAdapter auxea = new EditableAdapter();
>         auxea.setOriginalDataSource(sds);
>
>         ProjectTable projectTable = ProjectFactory.createTable
> (name,auxea);
>
>         ProjectExtension ext = (ProjectExtension)
> PluginServices.getExtension(ProjectExtension.class ); ext.getProject
> ().addDocument(projectTable);
>
>
> FALLA en createRandomDataSource, porque dice que no encuentra el driver,
> he consultado también todos los drivers que hay en
> LayerFactory.getDataSourceFactory() y el único que hay es el de la
> conexión al dbf del shape.
>
> ¿Qué driver le tengo que indicar a "LayerFactory.getDataSourceFactory().addDBDataSourceBySQL(name,
> conn, "select * from encuesta", driverInfo); "? Me imagino que el driver de
> mysql, pero tendré que crear un nuevo driver en el proyecto, para conexion a
> la mysql.
>
> Por favor si me podeis ayudar en esto os lo agradecería mucho ¿Como
> traerme al proyecto datos de una BBDD mysql? necesito saber que clases usar.
> El código de arriba lo he adaptado de una pregunta que hicieron en la lista
> de desarrolladores, pero en la misma creaban una tabla a partir de un dbf, y
> el driver lo creaban como DBFDriver, pero yo no tengo ninguna clase
> MySQLDriver.
>
> Espero vuestra ayuda.
>
> Un saludo,
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20070802/f259534b/attachment-0001.htm


Más información sobre la lista de distribución gvSIG_desarrolladores