[Gvsig_desarrolladores] como añadir una linea a un dbf que no es de un shape en mobile

Juan Lucas Dominguez Rubio jldominguez en prodevelop.es
Mie Jun 9 12:18:01 CEST 2010


Hola.
 
Añadir una fila a un DBF implica tamién modificar la cabecera del archivo DBF (no es solamente añadir cosas al final), así que no creo que sea fácil añadir una línea a un DBF en una PDA sin reescribir todo el archivo. 
 
Si has de manejar en la PDA archivos DBF que no son muy pequeños, lo lógico sería:
 
- Cargar el DBF en memoria (eso ya lo estás haciendo)
- Modificar (en memoria) el DBF varias veces durante la sesión de trabajo
- Una vez terminado el trabajo, almacenar en disco el DBF, escribiéndolo completamente
 
¿Esto no es posible en tu caso? ¿De qué tamaño es tu DBF? ¿Puedes explicar un poco como usas los DBF? (desde el punto de vista de un usuario)
 
Saludos,
 
 
Juan Lucas Domínguez Rubio
---
Prodevelop SL, Valencia (España)
Tlf.: 96.351.06.12 -- Fax: 96.351.09.68
http://www.prodevelop.es <http://www.prodevelop.es/> 
---

________________________________

De: gvsig_desarrolladores-bounces en listserv.gva.es en nombre de agirrearri
Enviado el: mié 09/06/2010 12:01
Para: gvsig_desarrolladores en listserv.gva.es
Asunto: Re: [Gvsig_desarrolladores] como añadir una linea a un dbf que no es de un shape en mobile




Yo solo quiero que meta la linea y no que lo escriba de nuevo. Y por lo que
he entendido la forma en lo que me has dicho se escribe toda la tabla. Al
ser una aplicacin de pda y eso afectara mucho segn vaya creciendo la
tabla.
Ahora tengo esto, lo cope de este foro a uno que tena el mismo problema.

public void addFila(String idapoyo, String idInci, boolean cerradaCheck,
                        String descVis, String fotoVisita, String fechaVisita) {
                // Funcin que aada una fila a una tabla.
                // ENTRADA: newRow => hashmap con los datos de la fila a insertar.
                // fName => ruta completa del dbf
                //tine un problema:tiene que reescribir toda la tabla y eso
                //supone un gasto de memoria y tiempo

                Object newLinea[] = new Object[9];
                newLinea[0] = new Integer(0);//gid
                newLinea[1] = new Integer(0);//idcor
                newLinea[2] = new Double(idapoyo);//id
                newLinea[3] = new Double(idInci);//idinci
                newLinea[4] = fechaVisita;//fechacor
                if (cerradaCheck) {//corregida
                        newLinea[5] = new Integer(0);//Integer.getInteger("0");
                } else {
                        newLinea[5] = new Integer(-1);//Integer.getInteger("-1");
                }
                newLinea[6] = descVis;//correccion
                newLinea[7] = fotoVisita;//fotovisita
                if (cerradaCheck) {//corregida
                        newLinea[8] = new Integer(0);//Integer.getInteger("0");
                } else {
                        newLinea[8] = new Integer(-1);//Integer.getInteger("-1");
                }


               
                try {
                        File f;
                        f = new File(nombre_dbf);
                        DbfMemoryDataSource drv;
                        drv = new DbfMemoryDataSource(f);
                        drv.start();

                        int numFilas = (int) drv.getRowCount();
                        int numCols = drv.getFieldCount();

                        DbaseFileHeaderNIO myHeader;
                        myHeader = DbaseFileHeaderNIO.createDbaseHeader(drv);
                        numFilas++;
                        myHeader.setNumRecords(numFilas);

                        OrderFileOutputStream outStream = new OrderFileOutputStream(f);
                        DbaseFileWriterNIO dbfWrite = new DbaseFileWriterNIO(myHeader,
                                        outStream);

                        FeatureTemp fea = new FeatureTemp();
                        fea.setFieldNames(drv.getFieldNames());

                        for (int j = 0; j < numFilas - 1; j++) {

                                fea.setValues(drv.getRow(j));
                                Object[] record = fea.getValues();
                                dbfWrite.write(record);
                        }

                        Object[] record = new Object[numCols];

                        for (int k = 0; k < numCols; k++) {
                                // record to string obj to string zan
                                record[k] = ValueFactory.createValueByType(newLinea[k]
                                                .toString(), drv.getFieldType(k));
                        }
                        dbfWrite.write(record);
                        dbfWrite.close();
                        outStream.close();

                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

        }

Hay posibilidad de aadir un registro sin tener que escribirlo de nuevo?

pd. yo utilizo javaDBF en para leer unos dbf-s en gvsig mobile y funciona en
pda.

Gracias, atentamente Eaut.
--
View this message in context: http://osgeo-org.1803224.n2.nabble.com/como-a-adir-una-linea-a-un-dbf-que-no-es-de-un-shape-en-mobile-tp5154700p5157624.html
Sent from the gvSIG desarrolladores mailing list archive at Nabble.com.
_______________________________________________
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores en listserv.gva.es
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20100609/6444e9a0/attachment.htm 


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