Capítulos 3 y 4

En esta unidad veremos instrucciones que permiten almacenar información / datos en Android :

proyecto0012

Shared Preferences

Las preferencias no son m´as que datos que una aplicación debe guardar para personalizar la experiencia del usuario, por ejemplo información personal, opciones de presentación, etc.  Android proporciona un método diseñado específicamente para administrar datos: las preferencias compartidas o shared preferences. Cada preferencia se almacenar´a en forma de clave-valor, es decir, cada una de ellas estar´a compuesta por un identificador único (por ejemplo “email”) y un valor asociado a dicho identificador (p.e. “prueba@email.com”).

La clase SharedPreferences o también conocida como preferencias, son datos que una aplicacion guarda personalizando la aplicación del usuario, como información personal, valores de configuración, etc.

Android tiene varias opciones para almacenar datos entre ellas esta que estamos tratando es simple pero puede ser muy útil, y estos datos pueden ser almacenados de forma permanente hasta que el usuario decida cambiarlos.

Esta clase es posible guardar datos de forma simple y pocos de ellos, como se menciono podemos usar otros métodos para almacenar mas datos y de forma masiva (eso dependiendo de lo que se desee almacenar y que tipos de datos, si es muy grande ya no es practico hacerlo con Android es fútil, para ello debemos de recurrir a otros administradores de datos como MySQL, con interfaces en PHP, pero eso ya es un tema muy aparte.)

Iniciamos creando nuestro proyecto0012

Creamos nuestro diseño



Y damos las distancias de los items:



Damos un tamaño de texto para ambos elementos, como lo hemos hecho lo pondremos de 24sp, para el texto e-mail, y button



en el archivo strings.xml








En MainActivity.java realizamos este código:


package com.example.dell.proyecto0012;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et1 = (EditText)findViewById(R.id.txt_mail);

        SharedPreferences my_preferences = getSharedPreferences("dato", Context.MODE_PRIVATE); //my_preferences puede ser otro nombre
        // ShredPreferences get obtiene el "dato" con un contexto de ambito privado
        // con ello obtiene el datos que se ha guardado previamente

        et1.setText(my_preferences.getString("mail",""));
        //establece el texto a et1 tomandolo del la linea de texto de e-mail
         }
         //metodo del boton guardar
        public void Guardar (View view) {
            SharedPreferences my_preferences = getSharedPreferences("dato", Context.MODE_PRIVATE);
            SharedPreferences.Editor Objeto_editar = my_preferences.edit();
            Objeto_editar.putString("mail",et1.getText().toString());
            Objeto_editar.commit(); // esto escribe el valor en forma permanente hasta que sea modificado
            finish();
        }
}

Asociamos el botón de Guardar


y se corre la app


  


proyecto0013

Shared Preferences (creación de una agenda)

Para esta ocasión crearemos una agenda usando la instrucción SharedPreferences, la cual escribiremos un nombre en un campo y en otro (multi-lineas) los datos que deseamos almacenar.

Iniciamos agregando un Plain Text y un Multiline Text




Agregamos dos controles de botón.



Asignamos el ID del Plain Text, que sera txt_nombre:



Y al campo multi lineas su ID es txt_datos:

Establecemos la distancia entre los Items ayud´andonos con la vista blueprint:



Todos los items  tienen un tamaño de 24sp excepto el de Multi Linea que trae por defecto 18sp, lo dem´as cambien los al que hemos usado 24sp,


Agregamos una propiedad de Bold usando el menú anterior  (Negritas en la opción textStyle)


Modificamos el archivo strings.xml para asignación de nombres a los items.


<resources>
    <string name="app_name">proyecto0013</string>
   <string name="txt_nombre">Nombre del contacto</string>
    <string name="txt_datos">Datos del contacto</string>
    <string name="botonGuardar">Guardar</string>
    <string name="botonBuscar">Buscar</string>
    <string name="nombre_del_contacto">Nombre del contacto</string>
</resources>

Los nombres de los items los asignamos a cada uno de ellos:

 

 

Como siempre comenzamos a crear nuestro código ActivityMain.java para este caso:

package com.example.dell.proyecto0013;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity{

    private EditText et_nombre, et_datos; // se crean la variables para recibir el nombre y los datos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_nombre = (EditText)findViewById(R.id.txt_nombre);
        et_datos = (EditText)findViewById(R.id.txt_datos);
    }
    //metodo para el boton guardar
    public void Guardar (View view) {
        // las siguientes variables son de tipo local solo tienen ambito de accion esn esta seccion delimitada con { y }
    String nombre = et_nombre.getText().toString();
    String datos = et_datos.getText().toString();

        SharedPreferences preferencias = getSharedPreferences("agenda", Context.MODE_PRIVATE);
        // estamos definiendo el nombre del archivo "agenda" donde se almacenaran los contactos y sus nombres

        SharedPreferences.Editor obj_editor = preferencias.edit();
        // se crea un objeto para recibir los datos del contacto

        obj_editor.putString(nombre,datos);
        //las variables de paso nombre y datos son asignadas al objeto con putString

        obj_editor.commit();
        //escribe el nombre y los datos al archivo llamado agenda

        Toast.makeText(this,"El contacto ha sido almacenado",Toast.LENGTH_LONG).show();

    }

    //metodo para el boton buscar
    public void Buscar (View view) {
        // las siguientes variables son de tipo local solo tienen ambito de accion esn esta seccion delimitada con { y }
        String nombre = et_nombre.getText().toString();
        SharedPreferences preferencias = getSharedPreferences("agenda", Context.MODE_PRIVATE);
        // toma el archivo "agenda" y lo abre permitiendo la lectura de datos
        String datos = preferencias.getString(nombre, "");
        //obtiene del archivo "datos"  el contenido de este

        if (datos.length() == 0) {
           Toast.makeText(this,"No se encontraron datos ",Toast.LENGTH_LONG).show();
        } else {
            et_datos.setText(datos); //se busca por nombre solo regresa el dato del contacto cuando se encuentra
        }

    }

}

Y se asocian los botones con las acciones que est´an programadas

 

proyecto0014

Almacenamiento de datos

Otra alternativa de almacenamiento de datos en el dispositivo de Android es el empleo de un archivo o fichero, y este se almacena en el sistema de almacenamiento interno del dispositivo.

Los archivos almacenados solo son accesibles por la aplicacion que los creo, no pueden ser leídos por otras aplicaciones,  y ni por el usuario del teléfono o dispositivo Android.

Cada aplicación dispone una carpeta especial para almacenar ficheros:

/data/data/nombre_del_paquete/files

La ventaja de usar esta carpeta, es cuando se desinstala los ficheros que se han creado se eliminaran de forma autom´atica.

Cuando se trabaja con ficheros en Android se debe de considerara que la memoria y el espacio de almacenamiento de los dispositivos es limitada.

Lo primero debemos incluir un control de multilínea.

Agregamos un botón.

Ajustamos distancias de los elementos, y asignamos al elemento multiline el ID txt_bitcora:



Agregamos al componente multiline una propiedad gravity, esto es para que se mantenga en la parte superior, es un cuadro muy grande y es posible que se mueva, y la aplicamos en las propiedades como:

       Ahí seleccionamos el color del texto (textColor)  y seleccionamos la herramienta que posee para la herramienta

  Pick a Resource (Selecciona un recurso)

que nos presentara lo siguiente:

bajo la sección Android, seleccionamos el color para esto sera black (negro).

y  en parte superior de la lista esta background (fondo de la multilinea)  seleccionamos de igual forma un color azul (puedes escoger otro pero ten en cuenta que colores intensos te cansan mas la vista) :



Y de forma idéntica a los casos anteriores el botón en 24 sp

En strings.xml realizamos lo siguiente:

<resources>
    <string name="app_name">proyecto0014</string>
    <string name="boton">Guardar</string>
    <string name="bitacora_escribe_texto">Bitacora escribe texto</string>
</resources>

Y asignamos el botón con este string.



Agrega la referencia del area de multilinea

pasamos a ActivityMain.java  y hacemos lo siguiente:


package com.example.dell.proyecto0014;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {

    private EditText et1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et1 = (EditText) findViewById(R.id.txt_bitacora);
        String archivos[] = fileList(); //crear un array de tipo texto para loa archivos que existen

        if (ArchivoExiste(archivos, "bitacora.txt")) {
            try { //use el try y catch cuidando la secuencia de llaves
                InputStreamReader archivo = new InputStreamReader(openFileInput("bitacora.txt"));
                //lectura de los datos desde el(los) archivos en el dispositivo, usando el nombre bitacora.txt
                BufferedReader br = new BufferedReader(archivo); //crea el objeto br a partir de BufferedReader
                //BufferedReader Lee texto de una secuencia de entrada de caracteres, almacenando en el búfer caracteres
                // para proporcionar la lectura eficiente de caracteres, matrices y líneas.
                String linea = br.readLine();
                String BitacoraCompleta = ""; //variable que recibe todos los datos (lineas del archivo

                while (linea != null) {
                    BitacoraCompleta = BitacoraCompleta + linea + "\n"; // concatena las variables para presentar los datos en una linea
                    linea = br.readLine();
                }
                br.close();//cierra la lectura de cada linea
                archivo.close();//cierra el archivo de datos
                et1.setText(BitacoraCompleta);// el objeto et1.establece el objeto como texto leido desde archivo

            } catch (IOException e) {

            } //termina catch
        } //termina if
    }

    private boolean ArchivoExiste(String archivos[], String NombreArchivo) {  //NombreArchivo hace referencia a bitacora.txt
                                                                                                                              // en la linea de if
        for (int i = 0; i < archivos.length; i++) //  cuenta la cantidad de lineas

            if (NombreArchivo.equals(archivos[i])) { //realiza una camaparcion cuando i es igual ala cantidad de lineas
                // se detiene y regresa un valor booleano de verdadero
                return true;
            }

        return false; //estos valores de regreso son porque la declaracion private es boolean

    }

    //metodo del boton
    public void Guardar(View view) {
        try {
            OutputStreamWriter archivo = new OutputStreamWriter(openFileOutput("bitacora.txt", Activity.MODE_PRIVATE));
            //al presionar el boton este usara el metodo OutputStreamWriter para guardar el texto en el archivo bitacora.txt
            archivo.write(et1.getText().toString()); // escribe la variale et1 como texto a archivo (variable)
            archivo.flush();
            archivo.close();
        } catch (IOException e) {

        }
        Toast.makeText(this,"Bitacora almacenada",Toast.LENGTH_LONG).show();
        finish();
    }
}

  Finalmente asignamos el botón a su asignación



Ejecute la app en su SmarthPhone

proyecto0015

En este proyecto realizaremos una app para almacenar (guardar)  un archivo en un medio externo (es decir en una memoria sd),  con un nombre que asigne el usuario, para ubicarlo r´apidamente.

Comenzamos como lo hemos hecho hasta ahora:

Iniciamos agregando un EditText:



agregamos un Item de Multilinea

Agregamos 2 button


Realizamos los ajustes de distancias



Para el primer Item su Id (PlainText) es txt_nombre.


para Multiline Text asigna su id como txt_contenido


Cambiamos el color de fondo en Multiline Text:


En la opción background y hacemos un clic en la sección con los putos (...), nos lleva a lo siguiente, donde seleccionamos Color > android > holo_blue_light


Agregamos la opción gravity, y de ahí para seleccionar top, manteniendo el item en la parte superior del ´area de trabajo.



Cambiamos el color del texto de esta ´area textColor



Seleccionamos el color blanco



Para los botones seleccionamos el tamaño a 24 sp



Modificamos string.xml



<resources>
    <string name="app_name">proyecto0015</string>
    <string name="txt_nombre">Nombre de Archivo</string>
    <string name="boton_Guardar">Guardar</string>
    <string name="boton_Consultar">Consultar</string>
    <string name="contenido">Contenido</string>
</resources>

Realizamos las asignaciones de los items

Pasamos a los botones y asignamos los nombres del texto, primero el botob izquierdo para Guardar el archivo, y del lado derecho para Consultar



Abrimos el manifiest, ya lo hemos usado anteriormente





agregamos la siguiente linea, y debajo de la instrucción package, al final debemos agregar /, para finalizar la linea.


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


Pasamos a MainActivity.java, donde realizamos la parte logica:


package com.example.dell.proyecto0015;

import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {

    private EditText et_nombre, et_contenido;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_nombre = (EditText)findViewById(R.id.txt_nombre);
        et_contenido = (EditText)findViewById(R.id.txt_contenido);

        }
       // metodo para el  boton guardar
       public void Guardar (View view){
           String nombre = et_nombre.getText().toString(); // nombre del archivo
           String contenido = et_contenido.getText().toString();

           try{
               // indicaremos la ruta a seguir para encontrar la tarjeta SD
               File tarjetaSD = Environment.getExternalStorageDirectory();//guarda de forma temporal el contenido en la ruta
                                                                                                                // en Environment.getExternalStorageDirectory();
               Toast.makeText(this, tarjetaSD.getPath(),Toast.LENGTH_LONG).show(); //mostrara la ruta donde se encontrara el archivo en al SD
               File rutaArchivo = new File(tarjetaSD.getPath(),nombre);
               OutputStreamWriter crearArchivo = new OutputStreamWriter(openFileOutput(nombre, Activity.MODE_PRIVATE));
               // usando OutputStreamWriter se crea el archivo contenido en la variable nombre

               crearArchivo.write(contenido); //escribe el "contenido" en crearArchivo
               crearArchivo.flush();  //borrra del bufer el "contenido"
               crearArchivo.close(); //cierra el archivo

               Toast.makeText(this,"Se guardo correctamente",Toast.LENGTH_LONG).show();
               et_nombre.setText("");  // borramos el valor del nombre
               et_contenido.setText("");  //se borra el valor de contenido



           }catch (IOException e){
               Toast.makeText(this,"No se guardo", Toast.LENGTH_SHORT).show();
           }

       }
        // metodo consulta

        public void Consultar(View view){
        //recuperar el archivo a leer usando el nombre del archivo et_nombre
        String nombre = et_nombre.getText().toString();


           try{
               File tarjetaSD = Environment.getExternalStorageDirectory();   //obtenemos la ruta al archivo en SD
               File rutaArchivo = new File(tarjetaSD.getPath(), nombre);
               InputStreamReader abrirArchivo = new InputStreamReader(openFileInput(nombre));   // secuencia para abrir el archivo
               BufferedReader leerArchivo = new BufferedReader(abrirArchivo);    //el contenido del archivo pasa al buffer
               String linea = leerArchivo.readLine();  // leer la primer linea de texto y guardarla en una variable
               String contenidoCompleto ="";  // inicializamos variable para recibir las lineas de texto

               while (linea != null){
                  contenidoCompleto = contenidoCompleto + linea + "\n";   // acumula las lineas leidas y finaliza cada uno con un salto de linea
                  linea = leerArchivo.readLine();
               }
               leerArchivo.close();
               abrirArchivo.close();
               et_contenido.setText(contenidoCompleto);   // lo recuperado se asigna ala variable et_contenido para que se observe este
           }catch (IOException e){
               Toast.makeText(this,"Error al recupeara archivo",Toast.LENGTH_LONG).show();

           }
        }

}

Y para terminar asignamos los eventos a los botones



proyecto0016

Implementaremos bases de datos al móvil, usando SQLite, crearemos una app con una base de datos SQLite para añadir persistencia de datos a tus desarrollos Android,

Una base de datos es un grupo de datos del mismo tópico, almacenados de forma sistem´atica para ser utilizados posteriormente.

Existen programas denominados (SGBD) SISTEMAS GESTORES DE BASES DE DATOS, que se encargan de almacenar los datos y posterior tratamiento, entre ellos se ha desarrollado el SQLite, que posee características interesantes como que no requiere un servidor, tamaño pequeño, precisa poca configuración, ser transaccional, y ser libre.

En SQLite se una un clase llamada SQLiteOpenHelper que es la que permitiría realizar las operaciones de almacenamiento, consulta, y modificación, tiene un solo constructor y dos métodos onCreate() y onUpdate().

Si deseas saber mas de base de datos hay muchas paginas que toman el tema que es muy extenso y elaborado pero puedes leer lo indispensable aquí.

Crearemos un proyecto para el manejo de base de datos en andriod, recordemos que esto es un proyecto sencillo y el manejo de base de datos en mucho mas elaborado y tiene su grado de dificultad, pero queremos iniciar la curiosidad sobre el manejo de bases de datos que es muy extendido en cualquier rama de la inform´atica.

comenzamos nuestro proyecto como los hemos realizado anteriormente, pero haremos una pausa al iniciar ya que nos desviaremos un poco al iniciar nuestra app.

Ahora haremos algo diferente tememos que usar una nueva clase (Una clase JAVA) para este proyecto que es incluir las bases de datos, SQLite, y necesitamos realizar lo siguiente, pasamos al lado izquierdo de Android Studio, y dentro de la sección de Java localizamos com.example.dell.proyecto0016, y ahí dentro esta MainActivity



y con el botón del lado izquierdo en MainActivity nos mostrara un menú  y seleccionamos New > Java Class



Después nos mostrara una nueva ventana que pondremos un el primer campo el nombre de AdminSQLiteOpenHelper, y solo aplicamos el botón OK.



lo que nos llevara a:



El propósito es realizar un control sobre la base de datos, aquí aplicamos lo que se llama Programación Orientada a Objetos (POO), adremos algunas explicaciones conforme se vaya avanzando.

Agregamos una clase para la administración de la base de datos.

import android.database.sqlite.SQLiteOpenHelper; //esta biblioteca es para usar el SQLite

agregaremos una instrucción llamada extends que permite realizar la herencia, esto significa que las características de un programa pasen a otro sin necesidad de duplicar o escribir el mismo código en diferentes programas y muchas veces.

public class AdminSQLiteOpenHelper extends SQLiteOpenHelper {

}

como ves se realiza la herencia de la biblioteca SQLiteOpenHelper que es nativa de Android, y posee propiedades de administración de SQLite,tambien podemos observar que se muestra un error:



Solicita que debemos implementar el el método onCreate, y onUpdate se usa la secuencia Alt + Enter:


les mostrara lo siguiente



donde estando seleccionadas las opciones y hacemos clic en OK, se formara de esta forma



se puede ver que la linea de public class sigue con un error y es porque se debe de agregar el constructor ( es un procedimiento que declara como sera el proceso de herencia) usamos de nuevo Alt + Enter


mostrando esto


donde seleccionamos la primer opción que tiene 4 par´ametros, y se incluir´a lo necesario:



package com.example.dell.proyecto0016;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; //esta biblioteca es para usar el SQLite


public class AdminSQLiteOpenHelper extends SQLiteOpenHelper {

    public AdminSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

con esto se ha formado el cuerpo base para al administración de la base de datos, modificaremos una sección (onCreate) para indicar la base de datos a usar.



agregamos lo siguiente para crear la base de datos y la tabla con sus datos a agregar a al BD.

 @Override
    public void onCreate(SQLiteDatabase BasedeDatos) {
    BasedeDatos.execSQL("create table articulos(codigo int primary key, descripcion text, precio real)");
    //creamos la tabla de la base de datos, y la tabla articulos, donde estan los campos codigo, descripcion, precio
    }



pasamos a activity_main.xml, su ID ser´a txt_codigo




Agregamos un Plain Text, su ID txt_descripcion :


un texto que recibe numero decimal para el precio:



Agregamos cuatro controles de botones



Asignamos los espacios de separación entre los items



y modificamos string.xml para los nombres de los items y su identificación



<resources>
    <string name="app_name">proyecto0016</string>
    <string name="txt_codigo">Codigo del Producto</string>
    <string name="txt_descripcion">Descripcion del Producto</string>
    <string name="txt_precio">Precio del Producto</string>
    <string name="BotonRegistrar">Registrar Producto</string>
    <string name="BotonBuscar">Buscar Producro</string>
    <string name="BotonEliminar">Eliminar Producto</string>
    <string name="BotonModificar">Modificar Producto</string>
</resources>

Asignando los strings a los Items


(nota en el campo descripción producto en la etiqueta text se presentara como Name solo borrelo para asignar el string)

Pasamos a la parte lógica MainActivity.java

package com.example.dell.proyecto0016;

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText et_codigo, et_descrripcion, et_precio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //relacion entre la parte logica y la parte grafica
        et_codigo = (EditText)findViewById(R.id.txt_codigo);
        et_descrripcion = (EditText)findViewById(R.id.txt_descripcion);
        et_precio = (EditText)findViewById(R.id.txt_precio);
        }
      // metodo para dar de alta los productos (solo son valores numericos enteros)
      public void Registrar (View view){
       AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
          SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //el metodo getWritableDatabase() es el metodo para leer y escribir en la base de datos

          String codigo = et_codigo.getText().toString();
          String descripcion = et_descrripcion.getText().toString();
          String precio = et_precio.getText().toString();

          //validamos el campo
          if(!codigo.isEmpty() && !descripcion.isEmpty() && !precio.isEmpty()){ //verifica si no esta vacio (!), diferente a vacio para los tres valores (&&) AND
              ContentValues registro = new ContentValues();
              registro.put("codigo", codigo); // coloca el valor adquirido del codigo al campo "codigo"  de la bd
              registro.put("descripcion",descripcion);
              registro.put("precio",precio);
              // hasta aqui ya se han guardado en la base de daatos los datos proporcionados por el usuario

              // despues pasaremos de base de datos a la tabla que nombramos articulos
              BasedeDatos.insert("articulos",null,registro); //inserta los datos a la tabla articulos, con  el objeto registro, anterior

              BasedeDatos.close(); //cerramos la base de datsos
              et_codigo.setText("");
              et_descrripcion.setText("");
              et_precio.setText("");
              //se borran los datos anteriores para que no se mezclen con nuevos

              Toast.makeText(this,"Registro exitoso", Toast.LENGTH_LONG).show();



          }else{
              Toast.makeText(this, "Debes de llenar todos los campos", Toast.LENGTH_LONG).show();
          }

      }

}

Haremos una pausa, para analizar y revisar el código anterior.

CONSULTA

Ahora realizaremos la consulta de las base de datos para ello usaremos utilizaremos el método rawQuery() de la clase SQLiteDatabase. Este método recibe directamente como par´ametro un comando SQL completo, donde indicamos los campos a recuperar y los criterios de selección. El resultado de la consulta lo obtendremos en forma de cursor, que posteriormente podremos recorrer para procesar los registros recuperados. Sirva la siguiente consulta a modo de ejemplo:

Cursor c = db.rawQuery(" SELECT codigo,nombre FROM Usuarios WHERE nombre='usu1' ", null);

tenemos a nuestra disposición varios métodos de la clase Cursor, entre los que destacamos dos de los dedicados a recorrer el cursor de forma secuencial y en orden natural:


moveToFirst(): mueve el puntero del cursor al primer registro devuelto. (el registro ubicado en la posicion donde coincide la busqueda)

moveToNext(): mueve el puntero del cursor al siguiente registro devuelto.

Los métodos moveToFirst() y moveToNext() devuelven TRUE en caso de haber realizado el movimiento correspondiente del puntero sin errores, es decir, siempre que exista un primer registro o un registro siguiente, respectivamente.

El codigo siguiente incluye el metodo de busqueda de datos (en color rojo)


package com.example.dell.proyecto0016;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText et_codigo, et_descrripcion, et_precio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //relacion entre la parte logica y la parte grafica
        et_codigo = (EditText)findViewById(R.id.txt_codigo);
        et_descrripcion = (EditText)findViewById(R.id.txt_descripcion);
        et_precio = (EditText)findViewById(R.id.txt_precio);
        }
      // metodo para dar de alta los productos (solo son valores numericos enteros)
      public void Registrar (View view){
       AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
          SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //el metodo getWritableDatabase() es el metodo para leer y escribir en la base de datos

          String codigo = et_codigo.getText().toString();
          String descripcion = et_descrripcion.getText().toString();
          String precio = et_precio.getText().toString();

          //validamos el campo
          if(!codigo.isEmpty() && !descripcion.isEmpty() && !precio.isEmpty()){ //verifica si no esta vacio (!), diferente a vacio para los tres valores (&&) AND
              ContentValues registro = new ContentValues();
              registro.put("codigo", codigo); // coloca el valor adquirido del codigo al campo "codigo"  de la bd
              registro.put("descripcion",descripcion);
              registro.put("precio",precio);
              // hasta aqui ya se han guardado en la base de daatos los datos proporcionados por el usuario

              // despues pasaremos de base de datos a la tabla que nombramos articulos
              BasedeDatos.insert("articulos",null,registro); //inserta los datos a la tabla articulos, con  el objeto registro, anterior

              BasedeDatos.close(); //cerramos la base de datos
              et_codigo.setText("");
              et_descrripcion.setText("");
              et_precio.setText("");
              //se borran los datos anteriores para que no se mezclen con nuevos

              Toast.makeText(this,"Registro exitoso", Toast.LENGTH_LONG).show();



          }else{
              Toast.makeText(this, "Debes de llenar todos los campos", Toast.LENGTH_LONG).show();
          }

      }

     //Metodo para consultar un articulo o producto
     public void Buscar(View view){
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
        // al igual que la seccion anterior, creamos el objeto admin abre la base de datos, se prepara la lectura de datos
         SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //gestiona la base de datos llamada BasedeDatos
         String codigo = et_codigo.getText().toString();

         if(!codigo.isEmpty()){
         Cursor fila = BasedeDatos.rawQuery("select descripcion, precio from articulos where codigo ="+ codigo, null);

         if(fila.moveToFirst()){
            et_descrripcion.setText(fila.getString(0));
//fila es el registro, getString obtiene el valor de la columna 0
            et_precio.setText(fila.getString(1));  //fila es el registro, getString obtiene el valor de la columna 1
            BasedeDatos.close();
             } else{
             Toast.makeText(this,"No existe el codigo ",Toast.LENGTH_LONG).show();
             BasedeDatos.close();
         }
         }else{
             Toast.makeText(this,"debes de intoduciir un codigo valido",Toast.LENGTH_LONG).show();

         }

     }// termina metodo buscar

}


BAJAS

El codigo siguiente incluye el metodo de borrar de datos (en color azul)

package com.example.dell.proyecto0016;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText et_codigo, et_descrripcion, et_precio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //relacion entre la parte logica y la parte grafica
        et_codigo = (EditText)findViewById(R.id.txt_codigo);
        et_descrripcion = (EditText)findViewById(R.id.txt_descripcion);
        et_precio = (EditText)findViewById(R.id.txt_precio);
        }
      // metodo para dar de alta los productos (solo son valores numericos enteros)
      public void Registrar (View view){
       AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
          SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //el metodo getWritableDatabase() es el metodo para leer y escribir en la base de datos

          String codigo = et_codigo.getText().toString();
          String descripcion = et_descrripcion.getText().toString();
          String precio = et_precio.getText().toString();

          //validamos el campo
          if(!codigo.isEmpty() && !descripcion.isEmpty() && !precio.isEmpty()){ //verifica si no esta vacio (!), diferente a vacio para los tres valores (&&) AND
              ContentValues registro = new ContentValues();
              registro.put("codigo", codigo); // coloca el valor adquirido del codigo al campo "codigo"  de la bd
              registro.put("descripcion",descripcion);
              registro.put("precio",precio);
              // hasta aqui ya se han guardado en la base de daatos los datos proporcionados por el usuario

              // despues pasaremos de base de datos a la tabla que nombramos articulos
              BasedeDatos.insert("articulos",null,registro); //inserta los datos a la tabla articulos, con  el objeto registro, anterior

              BasedeDatos.close(); //cerramos la base de datos
              et_codigo.setText("");
              et_descrripcion.setText("");
              et_precio.setText("");
              //se borran los datos anteriores para que no se mezclen con nuevos

              Toast.makeText(this,"Registro exitoso", Toast.LENGTH_LONG).show();



          }else{
              Toast.makeText(this, "Debes de llenar todos los campos", Toast.LENGTH_LONG).show();
          }

      }

     //Metodo para consultar un articulo o producto
     public void Buscar(View view){
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
        // al igual que la seccion anterior, creamos el objeto admin abre la base de datos, se prepara la lectura de datos
         SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //gestiona la base de datos llamada BasedeDatos
         String codigo = et_codigo.getText().toString();

         if(!codigo.isEmpty()){
         Cursor fila = BasedeDatos.rawQuery("select descripcion, precio from articulos where codigo ="+ codigo, null);

         if(fila.moveToFirst()){
            et_descrripcion.setText(fila.getString(0));
//fila es el registro, getString obtiene el valor de la columna 0
            et_precio.setText(fila.getString(1));  //fila es el registro, getString obtiene el valor de la columna 1
            BasedeDatos.close();
             } else{
             Toast.makeText(this,"No existe el codigo ",Toast.LENGTH_LONG).show();
             BasedeDatos.close();
         }
         }else{
             Toast.makeText(this,"debes de intoduciir un codigo valido",Toast.LENGTH_LONG).show();

         }

     }// termina metodo buscar


    // metodo para borrar un articulo o producto
    public void Borrar (View view){
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion", null,1);
        //se crea un nuevo objeto llamado admin usando las propiedades de AdminSQLite
        SQLiteDatabase BasedeDatos = admin.getWritableDatabase();

        String codigo = et_codigo.getText().toString();
        if(!codigo.isEmpty()){
            int cantidad = BasedeDatos.delete("articulos", "codigo =" + codigo, null);

            //se usa esto para enviar una bandera (1) que indica que se borro un regisro (numero 1)
            BasedeDatos.close();

            et_codigo.setText("");
            et_descrripcion.setText("");
            et_precio.setText("");

            if(cantidad == 1){
//verifica si la bandera esta presente si no es igual a 0  o bien null si es  1 es que si se realizo el borrado
                Toast.makeText(this,"Articulo eliminado", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "No se elimino", Toast.LENGTH_LONG).show();
            }
        } else {
          Toast.makeText(this, "Debes introducir un codigo", Toast.LENGTH_SHORT).show();
        }

    }//termina metodo borrar


}



MODIFICACIONES

El codigo siguiente incluye el metodo de modificar de datos (en color verde)

package com.example.dell.proyecto0016;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText et_codigo, et_descrripcion, et_precio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //relacion entre la parte logica y la parte grafica
        et_codigo = (EditText)findViewById(R.id.txt_codigo);
        et_descrripcion = (EditText)findViewById(R.id.txt_descripcion);
        et_precio = (EditText)findViewById(R.id.txt_precio);
        }
      // metodo para dar de alta los productos (solo son valores numericos enteros)
      public void Registrar (View view){
       AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
          SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //el metodo getWritableDatabase() es el metodo para leer y escribir en la base de datos

          String codigo = et_codigo.getText().toString();
          String descripcion = et_descrripcion.getText().toString();
          String precio = et_precio.getText().toString();

          //validamos el campo
          if(!codigo.isEmpty() && !descripcion.isEmpty() && !precio.isEmpty()){ //verifica si no esta vacio (!), diferente a vacio para los tres valores (&&) AND
              ContentValues registro = new ContentValues();
              registro.put("codigo", codigo); // coloca el valor adquirido del codigo al campo "codigo"  de la bd
              registro.put("descripcion",descripcion);
              registro.put("precio",precio);
              // hasta aqui ya se han guardado en la base de daatos los datos proporcionados por el usuario

              // despues pasaremos de base de datos a la tabla que nombramos articulos
              BasedeDatos.insert("articulos",null,registro); //inserta los datos a la tabla articulos, con  el objeto registro, anterior

              BasedeDatos.close(); //cerramos la base de datos
              et_codigo.setText("");
              et_descrripcion.setText("");
              et_precio.setText("");
              //se borran los datos anteriores para que no se mezclen con nuevos

              Toast.makeText(this,"Registro exitoso", Toast.LENGTH_LONG).show();



          }else{
              Toast.makeText(this, "Debes de llenar todos los campos", Toast.LENGTH_LONG).show();
          }

      }

     //Metodo para consultar un articulo o producto
     public void Buscar(View view){
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion",null,1);
        // al igual que la seccion anterior, creamos el objeto admin abre la base de datos, se prepara la lectura de datos
         SQLiteDatabase BasedeDatos = admin.getWritableDatabase(); //gestiona la base de datos llamada BasedeDatos
         String codigo = et_codigo.getText().toString();

         if(!codigo.isEmpty()){
         Cursor fila = BasedeDatos.rawQuery("select descripcion, precio from articulos where codigo ="+ codigo, null);

         if(fila.moveToFirst()){
            et_descrripcion.setText(fila.getString(0));
//fila es el registro, getString obtiene el valor de la columna 0
            et_precio.setText(fila.getString(1));  //fila es el registro, getString obtiene el valor de la columna 1
            BasedeDatos.close();
             } else{
             Toast.makeText(this,"No existe el codigo ",Toast.LENGTH_LONG).show();
             BasedeDatos.close();
         }
         }else{
             Toast.makeText(this,"debes de intoduciir un codigo valido",Toast.LENGTH_LONG).show();

         }

     }// termina metodo buscar


    // metodo para borrar un articulo o producto
    public void Borrar (View view){
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,"administracion", null,1);
        //se crea un nuevo objeto llamado admin usando las propiedades de AdminSQLite
        SQLiteDatabase BasedeDatos = admin.getWritableDatabase();

        String codigo = et_codigo.getText().toString();
        if(!codigo.isEmpty()){
            int cantidad = BasedeDatos.delete("articulos", "codigo =" + codigo, null);

            //se usa esto para enviar una bandera (1) que indica que se borro un regisro (numero 1)
            BasedeDatos.close();

            et_codigo.setText("");
            et_descrripcion.setText("");
            et_precio.setText("");

            if(cantidad == 1){
//verifica si la bandera esta presente si no es igual a 0  o bien null si es  1 es que si se realizo el borrado
                Toast.makeText(this,"Articulo eliminado", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "No se elimino", Toast.LENGTH_LONG).show();
            }
        } else {
          Toast.makeText(this, "Debes introducir un codigo", Toast.LENGTH_SHORT).show();
        }

    }//termina metodo borrar

    //metodo para modificar un articulo o producto
    public void Modificar (View view){
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this, "administracion", null,1);
        SQLiteDatabase BasedeDatos = admin.getWritableDatabase();


        String codigo = et_codigo.getText().toString();
        String descripcion = et_descrripcion.getText().toString();
        String precio = et_precio.getText().toString();

        // las lineas anteriores son para recibir los nuevos datos de  la modificcion se realizen modificaciones o no

        if (!codigo.isEmpty() && !descripcion.isEmpty() && !precio.isEmpty()){
            //verificamos que codigo, descripcion y precio no esten vacios

            ContentValues registro = new ContentValues();
            //guardaremos los valores que se modificaron en el objeto registro
            registro.put("codigo",codigo); //lleva la referncia y la variable
            registro.put("descripcion",descripcion); //lleva la referncia y la variable
            registro.put("precio",precio); //lleva la referncia y la variable

            int cantidad = BasedeDatos.update("articulos", registro, "codigo ="+codigo,null );
            // esta linea modifica los valores de la Base de Datos, cantidad recibe un 1 por que se modifico un solo producto
            BasedeDatos.close(); //cerramos la base de datos

            // verificamos si el articulo existe o no
             if(cantidad ==1 ){
                 Toast.makeText(this,"Articulo modificado ",Toast.LENGTH_LONG).show();
             }else{
                 Toast.makeText(this,"Articulo no existe ",Toast.LENGTH_LONG).show();
             }

        }else {
            Toast.makeText(this,"Debes de llenar todos los campos",Toast.LENGTH_LONG).show();
        }

    }
//termina metodo modificar

}



Pasamos a asignar alos botones los metodos creados anteriormente.


continuando con los metodos adicionales

Para verificar que se ha formado correctamente la base de datos, tenemos una forma de revisar esto y al tiempo de esto conoceremos como es nuestro sistema de archivos del móvil, para ello deber´a de estar conectado a la computadora, y procedemos de la siguiente forma que se muestra en este video.


Capitulo 4

Instalación del programa Android en un dispositivo real

Este tema fue tratado al comienzo de este curso en Capitulo 1



REFERENCIAS

Proyecto0012 y proyecto 0013
https://developer.android.com/training/data-storage/shared-preferences
https://developer.android.com/reference/android/content/SharedPreferences
proyecto0014
http://www.aprendeandroid.com/l8/listar_archivos.htm
https://developer.android.com/reference/java/io/BufferedReader
http://www.java2s.com/Code/Android/File/ReadInputStreamwithBufferedReader.htm
proyecto0015
https://support.google.com/android/answer/6088895?hl=es
https://www.xatakandroid.com/sistema-operativo/android-y-aplicaciones-en-la-tarjeta-sd-quien-puede-y-quien-no
https://elandroidelibre.elespanol.com/2017/01/tarjetas-microsd-datos-problemas-informacion.html
proyecto0016
Altas de datos
http://www.androidcurso.com/index.php/tutoriales-android/42-unidad-9-almacenamiento-de-datos/309-bases-de-datos
http://blog.saducelabs.com/android/android-y-sqlite/
Consultas
http://www.sgoliver.net/blog/bases-de-datos-en-android-iii-consultarrecuperar-registros/
http://www.androidcurso.com/index.php/recursos/42-unidad-9-almacenamiento-de-datos/310-los-metodos-query-y-rawquery
Bajas
http://www.sgoliver.net/blog/bases-de-datos-en-android-ii-insertaractualizareliminar/