lunes, 11 de mayo de 2020

Android cargar Listview con datos de SQLite

Este ejemplo muestra de manera sencilla como cargar en un Listview los datos de una tabla de  SQLite, puede no ser la forma más elegante.


Se crea primero un Activity de ABM o CRUD de una tabla de SQLite, el último botón (Listar Registros)  llama al segundo Activity y muestra el listado, además se utiliza una clase que hereda de SQLiteOpenHelper.



1) Crear nuevo proyecto de Android Studio
2) Crear emptyActivity: activity_main.xml,  MainActivity.java
3) Crear clase auxiliar AdminSQLiteOpenHelper.java
4) Crear emptyActivity: activity_lista_registros.xml, ListaRegistros.java
5) Ejecutar proyecto
6) Primero crear algunos registros
7) Presionar botón Listar Registros


Se incluye código de lo .xml de las 2 actividades.

NOTAS:
- El nombre de la base de datos "administracion", de la tabla "articulos" así como los campos deben coincidir entre las clases  AdminSQLiteOpenHelper.java y MainActivity.java
- El activity del ABM se basa en el tutorial de ejemplo en http://www.tutorialesprogramacionya.com/javaya/androidya/androidstudioya/detalleconcepto.php?codigo=16&inicio=0




A continuación se anexan los códigos.



##########
2) Crear emptyActivity activity_main.xml,  MainActivity.java

PRIMER Activity
activity_main.xml
##########

<?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=".MainActivity">

    <EditText
        android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="codigo"
        android:inputType="number" />

    <EditText
        android:id="@+id/et2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Descripción Articulo"
        android:inputType="textPersonName" />

    <EditText
        android:id="@+id/et3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Precio"
        android:inputType="numberDecimal" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="alta"
        android:text="Alta" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="consultaporcodigo"
        android:text="Consulta por código" />

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="consultapordescripcion"
        android:text="Consulta por Descripción" />

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="bajaporcodigo"
        android:text="Baja" />

    <Button
        android:id="@+id/button5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="modificacion"
        android:text="Modificar" />
    <Button
        android:id="@+id/btnListar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="listarRegistos"
        android:text="Listar Registros" />

</LinearLayout>



################
Clase de actividad ABM o CRUD
MainActivity.java
################


/**
 * 1. Activity para ABM o CRUD de una tabla de SQLite
 * Basado en:
 * Almacenamiento en una base de datos SQLite
 * http://www.tutorialesprogramacionya.com/javaya/androidya/androidstudioya/detalleconcepto.php?codigo=16&inicio=0
 *
 * 2. Llama segundo Activity con listado de registros de SQLite
 *
 */

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private EditText et1,et2,et3;

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


        et1=(EditText)findViewById(R.id.et1);
        et2=(EditText)findViewById(R.id.et2);
        et3=(EditText)findViewById(R.id.et3);
    }

    public void alta(View v) {
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,
                "administracion", null, 1);
        SQLiteDatabase bd = admin.getWritableDatabase();
        String cod = et1.getText().toString();
        String descri = et2.getText().toString();
        String pre = et3.getText().toString();
        ContentValues registro = new ContentValues();
        registro.put("codigo", cod);
        registro.put("descripcion", descri);
        registro.put("precio", pre);
        bd.insert("articulos", null, registro);
        bd.close();
        et1.setText("");
        et2.setText("");
        et3.setText("");
        Toast.makeText(this, "Se cargaron los datos del artículo",
                Toast.LENGTH_SHORT).show();
    }

    public void consultaporcodigo(View v) {
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,
                "administracion", null, 1);
        SQLiteDatabase bd = admin.getWritableDatabase();
        String cod = et1.getText().toString();
        Cursor fila = bd.rawQuery(
                "select descripcion,precio from articulos where codigo=" + cod, null);
        if (fila.moveToFirst()) {
            et2.setText(fila.getString(0));
            et3.setText(fila.getString(1));
        } else
            Toast.makeText(this, "No existe un artículo con dicho código",
                    Toast.LENGTH_SHORT).show();
        bd.close();
    }

    public void consultapordescripcion(View v) {
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,
                "administracion", null, 1);
        SQLiteDatabase bd = admin.getWritableDatabase();
        String descri = et2.getText().toString();
        Cursor fila = bd.rawQuery(
                "select codigo,precio from articulos where descripcion='" + descri +"'", null);
        if (fila.moveToFirst()) {
            et1.setText(fila.getString(0));
            et3.setText(fila.getString(1));
        } else
            Toast.makeText(this, "No existe un artículo con dicha descripción",
                    Toast.LENGTH_SHORT).show();
        bd.close();
    }

    public void bajaporcodigo(View v) {
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,
                "administracion", null, 1);
        SQLiteDatabase bd = admin.getWritableDatabase();
        String cod= et1.getText().toString();
        int cant = bd.delete("articulos", "codigo=" + cod, null);
        bd.close();
        et1.setText("");
        et2.setText("");
        et3.setText("");
        if (cant == 1)
            Toast.makeText(this, "Se borró el artículo con dicho código",
                    Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(this, "No existe un artículo con dicho código",
                    Toast.LENGTH_SHORT).show();
    }

    public void modificacion(View v) {
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,
                "administracion", null, 1);
        SQLiteDatabase bd = admin.getWritableDatabase();
        String cod = et1.getText().toString();
        String descri = et2.getText().toString();
        String pre = et3.getText().toString();
        ContentValues registro = new ContentValues();
        registro.put("codigo", cod);
        registro.put("descripcion", descri);
        registro.put("precio", pre);
        int cant = bd.update("articulos", registro, "codigo=" + cod, null);
        bd.close();
        if (cant == 1)
            Toast.makeText(this, "se modificaron los datos", Toast.LENGTH_SHORT)
                    .show();
        else
            Toast.makeText(this, "no existe un artículo con el código ingresado",
                    Toast.LENGTH_SHORT).show();
    }

    public void listarRegistos(View v){
        /** Inicia Activity con listado de registros
         * de la tabla de SQLite
         */
        Intent i=new Intent(this,ListaRegistros.class);
        startActivity(i);
    }
}

       
 



################
3) Crear clase auxiliar AdminSQLiteOpenHelper.java

Clase de manejo de la BD
AdminSQLiteOpenHelper.java
################


  
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

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) {
        db.execSQL("create table articulos(codigo int primary key,descripcion text,precio real)");
    }

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

    }
}
       
 

################
4) Crear emptyActivity activity_lista_registros.xml, ListaRegistros.java

SEGUNDO Activity, crear nuevo con nombre:  ListaRegistros
activity_lista_registros.xml
################

<?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=".ListaRegistros">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Registros en BD"
        android:textAlignment="center" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <ListView
            android:id="@+id/listView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />


    </LinearLayout>

</LinearLayout>




##################
ListaRegistros.java
##################





import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.Vector;

/**
 * Clase que muestra un listado de los registros de la BD interna
 *
 * Autor: jjgarsal 2020
 *
 */

public class ListaRegistros extends AppCompatActivity {
    private ListView lv1;

    private Vector datosRegistro;
    /**
     * Manipulación de clase Vector
     * http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/colecciones/vector.htm
     */

    private ArrayAdapter adaptador1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_registros);
        datosRegistro=consultaBD();
        adaptador1=new ArrayAdapter(this,android.R.layout.simple_list_item_1,datosRegistro);
        lv1=(ListView)findViewById(R.id.listView1);
        lv1.setAdapter(adaptador1);



        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView arg0, View arg1, int i,
                                    long arg3) {

                 /* 
                 vectorArticulos[] se llena con los Campos  del registro seleccionado en 
                 el ListView, el registro se separa con el método split(" ") en cada uno 
                 de los Campos del registro 
                */

                String vectorArticulos[] =datosRegistro.elementAt(i).toString().split(" ");
                String idArticulo = vectorArticulos[0]; // Obtiene ID del String


                ver(idArticulo);

            }});

    }

    public void ver (String id) {
        /**
         * Llama a Activity con datos del registro
         */
//        Intent i=new Intent(this,verDatosArticulo.class);
//        i.putExtra("indiceRegistro", id);
//        startActivity(i);

        Toast.makeText(this, "Registro: "+id,
                Toast.LENGTH_SHORT).show();


    }

    public Vector consultaBD(){

        Vector v = new Vector();

        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this,
                "administracion", null, 1);
        SQLiteDatabase bd = admin.getWritableDatabase();

        Cursor fila = bd.rawQuery(
                "select * from articulos", null);
        if(fila.moveToFirst()){
            do {
                // Obtiene 2 primeros campos de la Tabla
                String cadena = "";
                cadena+=fila.getString(0)+" ";
                cadena+=fila.getString(1);

                v.add(cadena);

            } while (fila.moveToNext());
            bd.close();


        } else {
            Toast.makeText(this, "No hay registros",
                    Toast.LENGTH_SHORT).show();
        }

        return v;

    }

}
       
 

Proyectos 2024. Desarrollo de Aplicaciones Móviles. UAT-FIC

Profesor: Dr. Juan José Garza Saldaña   Facultad de Ingeniería y Ciencias Universidad Autónoma de Tamaulipas Los estudiantes de la materia d...