Thursday, September 24, 2020

INSERTAR EN SQLITE, ANDROID STUDIO

    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

 1.- Guardar 6 imágenes de productos  (De acuerdo al tema elegido)

           - 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í:






Recuerda que para todos los Edit Textà  cambiar la palabra text por hint 


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_capturaprod
13.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

@Override
public 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












FLEXSLIDER HTML5

  PRACTICA 020: HTML: FLEXSLIDER Ing. Honoria Reyes Macedo  IDE: Dreamweaver, Atom o Block de notas Lenguaje de paginas ESTATICAS: HTML...