martes, 1 de diciembre de 2020

AndroidNetworking. Consulta programáticamente a servidor Web con PHP desde app Android utilizando librería AndroidNetworking, con resultados en listView

 


El usuario se conectará programaticamente a un servidor Web apache desde una app con Android utilizando la librería de AndroidNetworking




0. Crear Base de datos id15XXXXX_escuela y tabla Alumnos con anterioridad


1. Colocar en el servidor WEB el script indexJson2.php


################

indexJson2.php


Crear Base de datos id15XXXXX_escuela y tabla Alumnos con anterioridad

Colocar en el servidor WEB

################



<?php


// Consulta a la BD de la tabla Alumnos

// Devuelve un String con un arreglo JSON


$servidor="localhost";

$usuario="id15XXXXXX_usrescuela";

$pwdUsuario="C*LJH7XXXXXX";

$nombreBD="id15XXXXX_escuela";



$conexion =  mysqli_connect($servidor, $usuario, $pwdUsuario,$nombreBD);

if (!$conexion) {

    die('No pudo conectarse: ' . mysqli_error($conexion));

}


$consulta = "SELECT * FROM Alumnos";



$result = mysqli_query($conexion, $consulta) or die('No pudo conectarse: ' . mysqli_error($conexion));

$numResults = mysqli_num_rows($result);


        if ($numResults > 0)

        {

    // $data guarda la matriz de los registros consultados

            $data = array();

            while ($row = mysqli_fetch_assoc($result))

            {

                $data[] = $row;

            }

// Crea 3 campos en el arreglo: registros, totRegistros, status

        $result = ['registros' => $data, 'totRegistros' => $numResults, 'status' => 'true'];


// Crea el objeto JSON

        echo json_encode($result);


}else{

    echo "No hay registros";

}



 mysqli_close($conexion);


?> 




######################

Consulta con AndroidNetworking

######################


0. Crear proyecto nuevo en Android Studio



1. Requiere permiso de Internet en el Manifest


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



2. En Gradle Scripts, en build.gradle(Module: app) agregar la librería de AndroidNetworking


implementation 'com.amitshekhar.android:android-networking:1.0.2'


3. Al agregar la línea de volley aparecerá un aviso SyncNow, para descargar las clases de la librería a nuestro proyecto


presionar el link


tardará en descargar algunos segundos o minutos.


4. Crear un nuevo Activity en blanco "Actividad2", en este se muestra el resultado de la consulta



-------------

activity_actividad2.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" >


    <TextView

        android:id="@+id/tv1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="TextView"

        android:textSize="24sp" />


    <ListView

        android:id="@+id/listView1"

        android:layout_width="match_parent"

        android:layout_height="match_parent" />

</LinearLayout>

-------------



5. En Actividad2.java pegar



-------------

Actividad2.java

-------------


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.TextView;

import android.widget.Toast;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


public class Actividad2 extends AppCompatActivity {


    public String[] arregloRegistrosBD;


    private TextView tv1;

    private ListView lv1;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_actividad2);


// recibe miArreglo de MainActivity.java

        Bundle bundle = getIntent().getExtras();

        String datos=bundle.getString("miArreglo");


        Toast.makeText(Actividad2.this,datos,Toast.LENGTH_LONG).show();


        parseDataEnArreglo(datos);


        tv1=(TextView)findViewById(R.id.tv1);

        lv1 =(ListView)findViewById(R.id.listView1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(Actividad2.this, android.R.layout.simple_list_item_1, arregloRegistrosBD);

        lv1.setAdapter(adapter);

        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override

            public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) {

                tv1.setText("Línea: "+ lv1.getItemAtPosition(posicion));


            }

        });


    }

    public void parseDataEnArreglo(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, totRegistros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         * 3. Los coloca en un arreglo de Strings

         */



        try {

            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                int cuenta = jsonObject.getInt("totRegistros");

                String temporal[] = new String[cuenta];

                for (int i = 0; i < dataArray.length(); i++) {


                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada campo de la linea en el Arreglo */

                    temporal[i] = dataobj.getString("nombre") +", " +dataobj.getString("clave") +", "+

                            dataobj.getString("calificacion");


                    //System.out.println("temporal=" + temporal[i]);


                }


                // Copia el arreglo temporal hacia el que se utiliza en el ListView

                arregloRegistrosBD = temporal.clone();

            }


            //System.out.println("paises=" + paises[0]+ " tam="+paises.length);


        } catch (JSONException e) {

            e.printStackTrace();

        }


    }

}


--------------



6. En activity_main.xml crear un boton y un TextView dentro de un scrollview (solo para ver resultados, es opcional)


-------------

activity_main.xml

-------------


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">


    <Button

        android:id="@+id/buttonAndNet"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:onClick="consultaAndroidNet"

        android:text="Buscar con AndroidNetworking" />



    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="match_parent">


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="vertical" >


            <TextView

                android:id="@+id/TextView01"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:textSize="8pt" />

        </LinearLayout>

    </ScrollView>



</LinearLayout>


-------------




7. En MainActivity.java colocar el código para hacer la consulta con Volley


Inicializar cola de peticiones de AndroidNetworking


Conectar al servidor donde esta el script "https://nombreDeServidor/ejemplo/indexJson2.php"



-------------

MainActivity.java

-------------


import androidx.appcompat.app.AppCompatActivity;


import android.app.ProgressDialog;

import android.content.Context;

import android.content.Intent;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.StrictMode;

import android.util.Log;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;



import com.androidnetworking.AndroidNetworking;

import com.androidnetworking.common.Priority;

import com.androidnetworking.error.ANError;

import com.androidnetworking.interfaces.StringRequestListener;



import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

import java.util.HashMap;

import java.util.Map;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;



public class MainActivity extends AppCompatActivity {

    private TextView salida;

    private RequestQueue colaPeticiones, requestQueue;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        salida = (TextView) findViewById(R.id.TextView01);



        //Inicializa para AndroidNetworking

        AndroidNetworking.initialize(getApplicationContext());


    }





    // Android Networking


    //// Codigo modificado

    public void consultaAndroidNet(View v){

        /**

         * Consulta servidor web por POST con librería AndroidNetworking

         * Más ejemplos en:

         * https://guides.codepath.com/android/Networking-with-the-Fast-Android-Networking-Library

         *

         * Hace petición y recibe en un String un JSONarray

         *

         */


        final String URL_DATA="https://nombreDeServidor/ejemplo/indexJson2.php";


        //AndroidNetworking.initialize(context);  Se movió a OnCreate

        AndroidNetworking.post(URL_DATA)

                /** En caso de necesitar pasar parámetros se pasan como las sig 2 lineas*/

                //.addBodyParameter("firstname", "Amit")

                //.addBodyParameter("lastname", "Shekhar")

                .setPriority(Priority.MEDIUM)

                .build()

                .getAsString(new StringRequestListener() {

                    @Override

                    public void onResponse(String response) {

                        Toast.makeText(MainActivity.this,response+"\nAndroidNetworking",Toast.LENGTH_SHORT).show();


                        // Muestra los registros en TextView: salida

                        parseData(response);


                        // Lanza Actividad2 y envia String con JSONarray: mi Arreglo

                        Intent i=new Intent(MainActivity.this, Actividad2.class);

                        i.putExtra("miArreglo", response);

                        startActivity(i);


                    }


                    @Override

                    public void onError(ANError anError) {

                        Toast.makeText(MainActivity.this,"*** ERROR: NO conecta con servidor "+anError.toString(),Toast.LENGTH_SHORT).show();

                        salida.append(anError.toString());


                    }

                });

    }


 


    public void parseData(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         */

        try {

            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                for (int i = 0; i < dataArray.length(); i++) {


                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada linea en el TextView salida */

                    salida.append(dataobj.getString("nombre") +"  ");

                    salida.append(dataobj.getString("clave") +"  ");

                    salida.append(dataobj.getString("calificacion") +"\n");




                }


                //Intent intent = new Intent(MainActivity.this,HobbyActivity.class);

                //startActivity(intent);

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }


    }




}


-------------


REFERENCIA:




lunes, 30 de noviembre de 2020

Android Volley. Consulta programáticamente a servidor Web con PHP desde app Android utilizando librería Volley, con resultados en listView

El usuario se conectará programaticamente a un servidor Web apache desde una app con Android utilizando la librería Volley, los resultados se muestran en Actividad2.java dentro de un listView

Requiere:

- Un Servidor Web con apache, php y mysql instalado.
- Base de Datos con una tabla Alumnos con los siguientes campos: id, nombre, clave, calificacion
- Una PC con Android Studio instalado, con un proyecto en Java creado


################
En el Servidor Web: Apache
################

0. Crear Base de datos id15XXXXX_escuela y tabla Alumnos con anterioridad en el Servidor

1. Colocar en el servidor WEB el script indexJson2.php


------------------------

indexJson2.php

------------------------


<?php


// Consulta a la BD de la tabla Alumnos

// Devuelve un String con un arreglo JSON


//Por seguridad las siguientes 4 variables se recomienda colocarlas en un archivo
//que no se pueda descargar del servidor Apache (usar un #include), por facilidad,
//en esta práctica se colocan dentro del mismo archivo .php 

$servidor="localhost";
$usuario="id15XXXXXX_usrescuela";
$pwdUsuario="C*LJH7XXXXXX";
$nombreBD="id15XXXXX_escuela";



$conexion =  mysqli_connect($servidor, $usuario, $pwdUsuario,$nombreBD);

if (!$conexion) {

    die('No pudo conectarse: ' . mysqli_error($conexion));

}


$consulta = "SELECT * FROM Alumnos";



$result = mysqli_query($conexion, $consulta) or die('No pudo conectarse: ' . mysqli_error($conexion));

$numResults = mysqli_num_rows($result);


        if ($numResults > 0)

        {

    // $data guarda la matriz de los registros consultados

            $data = array();

            while ($row = mysqli_fetch_assoc($result))

            {

                $data[] = $row;

            }

// Crea 3 campos en el arreglo: registros, totRegistros, status

        $result = ['registros' => $data, 'totRegistros' => $numResults, 'status' => 'true'];


// Crea el objeto JSON

        echo json_encode($result);


}else{

    echo "No hay registros";

}



 mysqli_close($conexion);


?> 




######################
En App Android. Crear App  para realizar Consulta con librería Volley
######################


0. Crear proyecto nuevo en Android Studio


1. Requiere permiso de Internet en el Manifest


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



2. En Gradle Scripts en build.gradle(Module: app) agregar la librería de Volley o actualizar la versión, en versiones nuevas de Android Studio ya esta agregada


implementation 'com.android.volley:volley:1.1.1'

 

Corrección a 2024-3

 

         implementation (libs.volley)


3. Al agregar la línea de volley aparecerá un aviso SyncNow, para descargar las clases de la librería a nuestro proyecto


presionar el link


tardará en descargar algunos segundos o minutos.


4. Crear un nuevo Activity en blanco "Actividad2", en este se muestra el resultado de la consulta



-------------

activity_actividad2.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" >


    <TextView

        android:id="@+id/tv1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="TextView"

        android:textSize="24sp" />


    <ListView

        android:id="@+id/listView1"

        android:layout_width="match_parent"

        android:layout_height="match_parent" />

</LinearLayout>

-------------




5. En Actividad2.java pegar


-------------

Actividad2.java

-------------

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.TextView;

import android.widget.Toast;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


public class Actividad2 extends AppCompatActivity {


    public String[] arregloRegistrosBD;

    private TextView tv1;

    private ListView lv1;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_actividad2);


        // recibe miArreglo de MainActivity.java

        Bundle bundle = getIntent().getExtras();

        String datos=bundle.getString("miArreglo");

        // Línea siguiente Toast... muestra datos recibidos en miArreglo

        //Toast.makeText(Actividad2.this,datos,Toast.LENGTH_LONG).show();

        parseDataEnArreglo(datos);


        tv1=(TextView)findViewById(R.id.tv1);

        lv1 =(ListView)findViewById(R.id.listView1);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(Actividad2.this, android.R.layout.simple_list_item_1, arregloRegistrosBD);

        lv1.setAdapter(adapter);


        lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {


            @Override

            public void onItemClick(AdapterView<?> parent, View v, int posicion, long id) {

                tv1.setText("Línea: "+ lv1.getItemAtPosition(posicion));

            }

        });


    }


    public void parseDataEnArreglo(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, totRegistros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         * 3. Los coloca en un arreglo de Strings

         */


        try {


            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                int cuenta = jsonObject.getInt("totRegistros");

                String temporal[] = new String[cuenta];


                for (int i = 0; i < dataArray.length(); i++) {

                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada campo de la linea en el Arreglo */

                    temporal[i] = dataobj.getString("nombre") +", " +dataobj.getString("clave") +", "+

                            dataobj.getString("calificacion");


                }


                // Copia el arreglo temporal hacia el que se utiliza en el ListView

                arregloRegistrosBD = temporal.clone();

            }else{

                Toast.makeText(Actividad2.this,"No devolvió registros el servidor",Toast.LENGTH_LONG).show();

            }


        } catch (JSONException e) {

            e.printStackTrace();

        }




    }


}



--------------



6. En activity_main.xml crear un boton y un TextView dentro de un scrollview (solo para ver resultados, es opcional)


-------------

activity_main.xml

-------------


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">


    <Button

        android:id="@+id/buttonVolley"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:onClick="buscaVolley"

        android:text="Buscar con Volley" />



    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="match_parent">


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="vertical" >


            <TextView

                android:id="@+id/TextView01"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:textSize="8pt" />

        </LinearLayout>

    </ScrollView>



</LinearLayout>


-------------





7. En MainActivity.java colocar el código para hacer la consulta con Volley, en este Activity se hace la conexión con Volley y se pasa el resultado a Actividad2


Inicializar cola de peticiones Volley


Conectar al servidor donde esta el script "https://nombreDeServidor/ejemplo/indexJson2.php"



-------------

MainActivity.java

-------------

import androidx.appcompat.app.AppCompatActivity;



import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;

import com.android.volley.Request;

import com.android.volley.RequestQueue;

import com.android.volley.Response;

import com.android.volley.VolleyError;

import com.android.volley.toolbox.StringRequest;

import com.android.volley.toolbox.Volley;

import java.util.HashMap;


import java.util.Map;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


public class MainActivity extends AppCompatActivity {

    private TextView salida;

    private RequestQueue requestQueue;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        salida = (TextView) findViewById(R.id.TextView01);


        //Inicializa cola de Volley

        requestQueue = Volley.newRequestQueue(this);


    }


    // Volley

    public void buscaVolley(View v){

        /**

         * Conecta al servidor utilizando Volley con POST

         * El servidor devuelve un ObjetoJSON con 3 campos: registros, status

         * Se le pueden pasar parámetros a través de un HashMap

         * Más información de Volley en : https://demonuts.com/android-volley/

         */


        // En la siguiente línea se debe sustituir con el nombreDelServidor

        String URLline = "https://nombreDelServidor.com/ejemplo/indexJson2.php";

        


        /** Para pasar algun parámetro al servidor por POST, se crean propiedades

         *  que obtienen información de los EditText, ejemplo: siguientes 2 lineas

         *  */


        //final String username = etUname.getText().toString().trim();

        //final String password = etPass.getText().toString().trim();


        StringRequest stringRequest = new StringRequest(Request.Method.POST, URLline,

                new Response.Listener<String>() {

                    @Override

                    public void onResponse(String response) {

                        Toast.makeText(MainActivity.this,"Conectando usando Volley",Toast.LENGTH_SHORT).show();


                        // LINEA SIGUIENTE CANCELADA Muestra los registros en TextView: salida

                        //parseData(response);


                        // Lanza Actividad2 y envia String con JSONarray: miArreglo

                        Intent i=new Intent(MainActivity.this, Actividad2.class);

                        i.putExtra("miArreglo", response);

                        startActivity(i);


                    }


                },

                new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {

                        Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();

                        salida.setText("Error de Volley, posible falla en conexión \n"+error.toString());

                    }

                }){


            @Override


            protected Map<String,String> getParams(){

                /**

                 *   Cada parámetro que se pasa al Servidor por POST, se coloca en el HashMap

                 * */


                Map<String,String> params = new HashMap<String, String>();

                // 2 Lineas CANCELADAS, muestran ejemplo de paso de parámetros

                //params.put("username",username);

                //params.put("password",password);


                return params;

            }

        };

        requestQueue.add(stringRequest);

    }


    public void parseData(String response) {

        /**

         * 1. Convierte String a JSONObject y separa los campos del JSONarray: registros, status

         * 2. Separa los campos de cada línea del arreglo: registros

         */


        try {

            JSONObject jsonObject = new JSONObject(response);

            if (jsonObject.getString("status").equals("true")) {

                JSONArray dataArray = jsonObject.getJSONArray("registros");

                for (int i = 0; i < dataArray.length(); i++) {

                    JSONObject dataobj = dataArray.getJSONObject(i);

                    /** Concatena cada linea en el TextView salida */

                    salida.append(dataobj.getString("nombre") +"  ");

                    salida.append(dataobj.getString("clave") +"  ");

                    salida.append(dataobj.getString("calificacion") +"\n");

                }

                //Intent intent = new Intent(MainActivity.this,HobbyActivity.class);

                //startActivity(intent);

            }

        } catch (JSONException e) {

            e.printStackTrace();

        }

    }


}

------------- Termina MainActivity.java

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