Mostrando entradas con la etiqueta openRawResource. Mostrar todas las entradas
Mostrando entradas con la etiqueta openRawResource. Mostrar todas las entradas

sábado, 4 de junio de 2016

ANDROID - Códigos postales de España - openRawResource(getResources().getIdentifier


Android

ANDROID
Códigos postales de España
getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));

Encontré una base de datos de códigos postales de España y era una buena ocasión de hacer una aplicación que buscara los códigos por provincias y calles o pueblos.
En este caso había realizado esta aplicación en gambas(VB linux), luego la he realizado para android.
Estos datos de CP(códigos postales) se colocan en el directorio /res/raw ,y solo son de lectura. Estos datos están organizados por capitales y provincias, y en algún que otro caso en ciudades grandes como Reus, Fuenlabrada, etc.
El fichero indice se llama codciuz.txt donde figuran nombres de capitales y provincias, y el nombre de fichero que corresponde a dicha capital o provincia.

280:MADRID
28X:MADRID
150:A CORUÑA
030:ALACANT/ALICANTE

Para el ejemplo de Madrid capital el fichero se llamará a280codpos.txt . El fichero original se llamaba 280codpos.txt  , pero en los recursos internos los ficheros no deben empezar por numero, no distingue entre mayúsculas y minúsculas , además la extensión no se utiliza, por lo que tuve que renombrar los ficheros.
En el fichero  están los datos postales ordenados de la siguiente forma:

28021:A (EL SALOBRAL)
28032:ABAD JUAN CATALAN
28013:ABADA
28012:ABADES
28039:ABADESA
28043:ABALOS
28037:ABANICO

En este fichero se recorre buscando concordancias con el nombre de la calle que se quiere buscar.



Recomiendo ver el anterior androj.html programa para entender este.
Lo diferente de este programa frente al anterior es el nombre de fichero de la provincia. En este caso no sabemos su nombre hasta que no nos lo proporcione la búsqueda por provincia, y esto lo solucionamos con la siguiente orden:
ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
Donde miProvincia es el nombre del fichero de recursos internos.
Utilizamos un buffer para aumentar la velocidad de acceso al fichero.
BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
Leemos línea por línea buscando concordancias con el nombre de calle.
while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }     
public void cuantosCX(String Lprovincia)
    {                 
        String miProvincia;
        Scalle=Mcalle.getText().toString();       
        Scalle=Scalle.toUpperCase();
        Mcalle.setText(Scalle); 
        miProvincia = Lprovincia.substring(0, Lprovincia.length()-4);
       
        try
        {
            if(ISentrada2 != null)    ISentrada2.close();       
            ISentrada2 = getResources().openRawResource(getResources().getIdentifier(miProvincia, "raw", getPackageName()));
            BFentrada2 = new BufferedReader(new InputStreamReader(ISentrada2));
           
            while ((Sentrada=BFentrada2.readLine()) != null)
            {
                String SentradaT[]= Sentrada.split(":");
                if(SentradaT[1].contains(Scalle))    
                    {
                        Ncalles++;  
                        Mcallel.append(Sentrada);
                        Mcallel.append("\n");
                    }
            }       
           
            ISentrada2.close();
        }
        catch (IOException e)
        {
            Log.e("Provincias->",e.getMessage(),e);
        }       
       
    }


PROGRAMA

Saludos
Juan Galaz


Bibliografía:

http://seta43.duckdns.org/android.html
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013

jueves, 19 de mayo de 2016

ANDROID - Municipios de España - openRawResource


Android

ANDROID
Municipios de España
openRawResource

En esta aplicación para android realizo una especie de base de datos que busca los municipios de España.
No estoy muy orgulloso de esta aplicación pero hace su función de enseñar como se utiliza datos insertados en la propia aplicación.
Estos datos de municipios se colocan en el directorio /res/raw ,y solo son de lectura. El fichero con la base de datos de municipios se llama municipios0.txt , debemos tener en cuenta que a la hora de utilizar los recursos internos, la extensión no se utiliza.
La base de datos la he pasado a mayúsculas y quitado los acentos. Lo he hecho debido a que la búsqueda es secuencial y lenta, además de que normalmente en los dispositivos android es lento añadir acentos y cambiar de minúsculas a mayúsculas.

Vamos a intentar explicar  este pequeño trozo de código de la función Fbuscar.
Lo primero es coger el texto del municipio a buscar y cambiarlo a mayúsculas .
  miclave=Mclave.getText().toString();       
  miclave=miclave.toUpperCase();
  Mclave.setText(miclave);  
Utilizamos try para manejar los error de abrir ficheros.
Abrimos el fichero y utilizamos un buffer para aumentar la velocidad de acceso al fichero.
  ISentrada=getResources().openRawResource(R.raw.municipios0);
   BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
Leemos una por una todas las líneas del fichero.
Troceamos cada línea separando por el carácter ":" .
Si la segunda cadena que ha salido del troceo contiene la cadena a buscar miclave , se para la busqueda y se muestra.
    while ((Sentrada=BFentrada.readLine()) != null)
      {
      String SentradaT[]= Sentrada.split(":");
      if(SentradaT[2].contains(miclave)) {Mostrar(); break;}
      }
public void Fbuscar(View view)
    {        
        miclave=Mclave.getText().toString();       
        miclave=miclave.toUpperCase();
        Mclave.setText(miclave);     
        Contar();    
       
        try
        {
            if(ISentrada != null)    ISentrada.close();
            ISentrada=getResources().openRawResource(R.raw.municipios0);
            BFentrada=new BufferedReader(new InputStreamReader(ISentrada));
           
            while ((Sentrada=BFentrada.readLine()) != null)
            {
            String SentradaT[]= Sentrada.split(":");
            if(SentradaT[2].contains(miclave))         {Mostrar(); break;}
            }
           
        }
        catch (IOException e)
        {
            Log.e("Municipios->",e.getMessage(),e);
        }       
    }


Me hubiera gustado no tener que abrir y cerrar el fichero para volver a la posición inicial, pero no he encontrado la función seek(0) para recursos internos, no se si existe o no. Esto hace al programa poco eficiente, pero funciona bien :( .


PROGRAMA

Saludos
Juan Galaz


Bibliografía:
http://android.okhelp.cz/java_android_code.php?s=openRawResource
http://www.programmershare.com/1333689/

ANDROID 4: DESARROLLO DE APLICACIONES (En papel)
ISBN 9788441531970
WEI MENG LEE , ANAYA MULTIMEDIA, 2012

EL GRAN LIBRO DE ANDROID (3ª ED.) (En papel)
ISBN 9788426719768
JESUS TOMAS GIRONES , S.A. MARCOMBO, 2013