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/