PRACTICA 007: Android: Insertar Producto
Ing. Honoria Reyes Macedo
IDE: Android Studio
Lenguaje de programación para móviles: Java
Sistema Operativo de desarrollo: Windows
Sistema Operativo de Ejecución: Android
Base de Datos: SQLite;
INTRODUCCION
En esta práctica se crea una pantalla de captura de datos. Se
utiliza una base de datos SQLite que ya viene
integrada en Android Studio. El programa crea la base de datos cuando ejecuta por
primera vez el guardado de los datos.
- La base de datos no se elimina de la aplicación hasta que la
aplicación sea eliminada.
- En esta práctica, la base de datos se llama Libros.db (De acuerdo al producto, se tendrá el nombre de la base de datos)
- Se utiliza una clase DBhelper
que hereda de SQLiteOpenHelper, para hacer posible la conexión
a la base de datos.
- Se utilizan imágenes de acuerdo al tema elegido.
- Los nombres de los campos de la base de datos se crean con
nombres que se puedan utilizar para guardar otro tipo de producto.
- Los nombres (ID) de los objetos que
se utilizan para capturar la información tienen el mismo nombre del campo
anteponiendo la palabra edit
ACTIVIDADES
- Renombrar las imágenes siguiendo un estándar.
El nombre debe estar en minúsculas y que todas empiecen con una silaba igual.
Ejemplo:
li_algebra.png, li_redes.png,
li_geometria.png
- Copiar las 6 imágenes en la carpeta drawable (con tamaño no mayor de 15 Kb)
2.- Guardar 2 iconos para el menú de Navigator Drawer (Una para captura y otra para salir)
2.- Guardar 2 iconos para el menú de
Navigator Drawer (Una para captura y otra para salir)
- Renombrarlos de
acuerdo al estándar del nombre del menú ya existente (inician con ic_menu_)
Ejemplo: ic_menu_salir.png , ic_menu_captura.png
- Copiar los iconos a
la carpeta drawable
Sugerencia de iconos: https://material.io/resources/icons/?icon=event&style=baseline
3.- Agregar las etiquetas correspondientes en el archivo strings.xml
3.1 Capturar las líneas de azul
Observar que los
nombres para menús empiezan con la palabra menu_
Observar que los
nombres para captura empiezan con la palabra c_
Observar que los
nombres para botones empiezan con la palabra b_
Nota: el valor en name no deberá
contener espacios
3.2 Agregar el siguiente arreglo de productos. Cambiar los nombres de las imágenes de acuerdo a tus imagenes de producto copiadas en la carpeta drawable. Dejar en primera opcion la palabra "SELECCIONE"
<string-array
name="cbo_fotoprod">
<item>SELECCIONE</item>
<item>li_algebrabaldor.jpg</item>
<item>li_disweb.jpg</item>
<item>li_geometriaana.jpg</item>
<item>li_jgotronos.jpg</item>
<item>li_somdviento.png</item>
<item>li_vueltaalmundo.jpg</item>
</string-array>
4.- Agregar un nuevo Fragment llamado fragment_capturaprod desde el archivo
mobile_navigation.xml (modo DISEÑO)
Seleccionar “Create
new destination”, seleccionar Fragment(Blank) poner el nombre fragment_capturaprod y seleccionar java
Listo, ya tienes un nuevo Fragment con su archivo .xml y su .class
5.- Modificar el título del nuevo fragmento (línea azul) en el archivo mobile_navigation.xml(modo CODIGO)
Agregar una opción en el fragmento para salir (Copiar la de nav_slideshow y solo
dejar dos lineas)
6.- Agregar la nueva opción al menú Navigation Drawer en el
archivo activity_main_drawer.xml
Agregar la opción “salir” al menu
Al Reconstruir el proyecto y Ejecutar quedaría así:
7.- En el nuevo fragmento fragment_capturaprod.xml
cambiar
el Layout a LinearLayout y su
orientación
8.- Agregar componentes en fragment_capturaprod.xml(En modo diseño )
Nota: Para el atributo id deberán iniciar con la palabra edit + nombre del campo
8.1 Para el primer campo: Agregar un “TextView” y un “Plain
Text” (Arrastrar los objetos hacia Component
Tree)
8.2 Modificar Atributos de los objetos arrastrados:
En el primer objeto TextViewà El atributo text
Observar que en el id le puso "textView2", no cambiarlo para este tipo de componente, a menos que se repita
Nota: Para el atributo text poner @ y te sugiere los nombres
En el segundo objeto Plain Text à Los 3 atributos: id, inputType y text
Para el atributo inputType dar click en la banderita y seleccionar el tipo de campo y seleccionar Apply
8.3 En el archivo fragment_capturaprod.xml(En modo codigo
)
Para todos los Edit
Text à cambiar la palabra text por hint
(esta
en azul)
9.- Repetir el paso 8 para cada campo a capturar (Agregar un “TextView” para cada uno de los campos)
ESTOS SON SUS RESPECTIVOS ID: (editCveprod ya fue generado en el paso anterior):
Cuatro Plain Text:
editCveprod
editNombreprod
editAutorprod
editPrecioprod
Un Spinner:
spnFotoprod
Un CheckBox:
chkActivo
Nota: Para el combo(spinner)
agregar desde Containers (figura siguiente)
Su ID=spnFotoprod
Al reconstruir y ejecutar
quedaría así:
El código de fragment_capturaprod.xml quedaría así (modo CODIGO):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragment_capturaprod">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/c_cveprod" />
<EditText
android:id="@+id/editCveprod"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number"
android:hint="@string/c_cveprod" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/c_nombreprod" />
<EditText
android:id="@+id/editNombreprod"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/c_nombreprod"
android:inputType="text" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/c_autorprod" />
<EditText
android:id="@+id/editAutorprod"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/c_autorprod"
android:inputType="text" />
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/c_fotoprod" />
<Spinner
android:id="@+id/spnFotoprod"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/c_precioprod" />
<EditText
android:id="@+id/editPrecioprod"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/c_precioprod"
android:inputType="numberDecimal" />
<CheckBox
android:id="@+id/chkActivo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/c_activo" />
<Button
android:id="@+id/btnGuardar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/b_guardar" />
</LinearLayout>
10.- Crear la clase para la entidad “Producto”
10.1.- Agregar los campos
a
capturar y su tipo y agregar su constructor
Nota: Para agregar el constructor
à con Alt +Ins
Agregar un constructor vacio (línea azul)
10.2.- Agregar Getter y Setter por cada campo en Producto.java
Nota: Para agregar el Getter y Setter à con Alt
+Ins
Quedaría así:
10.3 Agregar dos variables
a la
clase Producto.java
private String campos; private String tabla;
10.4 Agregar dos métodos
a la
clase Producto.java
public String getTabla(){ this.tabla="producto"; return tabla; } public String getCampos(){ this.campos= "cveprod Integer primary key, " + "nombreprod Text, " +"autorprod Text, " +
"precioprod Text, " +
"fotoprod Text, " +
"fechacaptura Text, " +
"activo Integer "; return campos; }
11.- Crear la clase DBhelper.java y hacer que herede de SQLiteOpenHelper
Nota: las líneas rojas indican
error o falta de datos. En algunos te sugiere teclear Alt +Enter para agregar librerías.
Cuando se termine este punto 11
ya no deberá marcar error
11.1.- Implementar los métodos de
la clase padre
11.2.- Agregar las líneas en ROJO en la clase DBhelper
- Cambiar el nombre de la base de datos Libros.db).
- Dar Alt + Enter cuando así lo sugiera.
Nota: No eliminar la primer linea Package que se genera cuando creas la clase
package com.example.control_hrm;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DBhelper extends SQLiteOpenHelper {
Producto campohelp = new Producto();
static final String DB_NAME = "Libros.db";
static final int DB_VERSION = 1;
private final String CREATE_TABLE = "create table if not exists "
+ campohelp.getTabla() + "(" + campohelp.getCampos() + " );";
public DBhelper(@Nullable Context context) {
super(context, DB_NAME, null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + campohelp.getTabla());
onCreate(sqLiteDatabase); }
}Quedaria asi:
- Reconstruir y Ejecutar
Nota: Al terminar el paso 11
ya no debe marcar errores al reconstruir
12.- Crear la clase ProductoADO
- Agregar las librerias y contenido correspondiente a la clase.
Nota: No eliminar la primer linea Package que se genera cuando creas la clase
La clase quedaría asi:
package com.example.control_hrm;import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ProductoADO {
private Context ourcontext;
private SQLiteDatabase database;
private DBhelper dbhelper;
public ProductoADO(){ }
public ProductoADO(Context c){
ourcontext= c;
}
public ProductoADO abrirBD()throws SQLException {
dbhelper= new DBhelper(ourcontext);
database = dbhelper.getWritableDatabase();
return this;
}
public void cerrarBD(){
dbhelper.close();
}
public long insertarProducto(Producto prod)throws SQLException{
int sts=0;
ContentValues registro = new ContentValues();
long result=1;
registro.put("cveprod", prod.getCveprod());
registro.put("nombreprod", prod.getNombreprod());
registro.put("autorprod", prod.getAutorprod());
registro.put("precioprod", prod.getPrecioprod());
registro.put("fotoprod", prod.getFotoprod());
SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
String hoy =formato.format(prod.getFechacaptura());
registro.put("fechacaptura", hoy);
if(prod.isActivo()) {
sts=1;
}
registro.put("activo", sts);
result = database.insert(prod.getTabla(),null,registro);
Log.d("VALORES INSERTADOS=", String.valueOf(result));
return result;
}
}
13.- Abrir y editar la clase fragment_capturaprod13.1.- Agregar las siguientes variables y objetos, como se muestra en la imagen:Producto prod_datos;ProductoADO datosBD;
private EditText loc_editCveprod, loc_editNombreprod, loc_editAutorprod,loc_editPrecioprod;
private CheckBox loc_chkActivo;
private Button loc_btnGuardar;
private Spinner loc_spnFotoprod;
private String varfoto;
Nota: con Alt +Enter se actualizan sus librerias
13.2.- Sustituir el método onCreateView con el siguiente
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_capturaprod, container, false);
prod_datos = new Producto();
datosBD = new ProductoADO(view.getContext());
loc_editCveprod = (EditText) view.findViewById(R.id.editCveprod);
loc_editNombreprod = (EditText) view.findViewById(R.id.editNombreprod);
loc_editAutorprod = (EditText) view.findViewById(R.id.editAutorprod);
loc_editPrecioprod = (EditText) view.findViewById(R.id.editPrecioprod);
loc_chkActivo = (CheckBox) view.findViewById(R.id.chkActivo);
loc_btnGuardar = (Button) view.findViewById(R.id.btnGuardar);
loc_spnFotoprod=(Spinner)
view.findViewById(R.id.spnFotoprod);
ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(view.getContext(),
R.array.cbo_fotoprod,R.layout.support_simple_spinner_dropdown_item);
loc_spnFotoprod.setAdapter(adapter);
loc_spnFotoprod.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
varfoto=adapterView.getItemAtPosition(i).toString();
}
@Override
public
void onNothingSelected(AdapterView<?> adapterView) {
}
});
loc_btnGuardar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
preparaDatos();
datosBD.abrirBD();
Log.d("MyApp", "Abrio la base......................... ");
datosBD.insertarProducto(prod_datos);
Log.d("MyApp", "Inserto en la base......................... ");
Toast.makeText(view.getContext(),"Se guardo con exito",Toast.LENGTH_LONG).show();
} catch (Exception e) {
Log.d("MyApp", "Error:......................... " + e.getMessage());
}
}
});
return view;
}
13.3 Agregar el método siguiente antes de cerrar la clase(como se muestra en la imagen):public void preparaDatos(){
prod_datos.setCveprod(Integer.valueOf(loc_editCveprod.getText().toString()));
prod_datos.setNombreprod(loc_editNombreprod.getText().toString());
prod_datos.setAutorprod(loc_editAutorprod.getText().toString());
prod_datos.setPrecioprod(Double.valueOf(loc_editPrecioprod.getText().toString()));
prod_datos.setFotoprod(varfoto);
prod_datos.setActivo(loc_chkActivo.isChecked());
prod_datos.setFechacaptura(new Date());
Log.d("Datos de Productos", "Preparo los datos........................ " + loc_chkActivo.isChecked() );
}
Estas son sus librerías (Cada que das Alt + Enter en objetos que marcan error se irán agregando)
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.Date;
14.- Reconstruir y Ejecutar
PARA VER RESULTADOS DE MENSAJES DE CONSOLA ABRIR LA VENTANA RUN
(Parte inferior)
-----------------------------0----0----------------------------
-----------------------000------000--------------------------
ANEXO I CREAR ESTILOS .- En la carpeta styles.xml dentro de <resources>
EJEMPLO DE SU USO












































