4.-Acceso a Datos usando Kotlin y SQLite

Compartelo:

SQLite

SQLite es una herramienta de software libre, que permite almacenar información en dispositivos empotrados de una forma sencilla, eficaz, potente, rápida y en equipos con pocas capacidades de hardware, como puede ser una PDA o un teléfono celular. SQLite implementa el estándar SQL92 y también agrega extensiones que facilitan su uso en cualquier ambiente de desarrollo. Esto permite que SQLite soporte desde las consultas más básicas hasta las más complejas del lenguaje SQL, y lo más importante es que se puede usar tanto en dispositivos móviles como en sistemas de escritorio, sin necesidad de realizar procesos complejos de importación y exportación de datos, ya que existe compatibilidad al 100% entre las diversas plataformas disponibles, haciendo que la portabilidad entre dispositivos y plataformas sea transparente.

Características

Estas son algunas de las características principales de SQLite:

  • La base de datos completa se encuentra en un solo archivo.
  • Puede funcionar enteramente en memoria, lo que la hace muy rápida.
  • Tiene un footprint menor a 230KB.
  • Es totalmente autocontenida (sin dependencias externas).
  • Cuenta con librerías de acceso para muchos lenguajes de programación.
  • Soporta texto en formato UTF-8 y UTF-16, así como datos numéricos de 64 bits.
  • Soporta funciones SQL definidas por el usuario (UDF).
  • El código fuente es de dominio público y se encuentra muy bien documentado.

Puede ver más información sobre SQLite yendo al sitio http://www.sqlite.org

Ejemplo

Realizaremos una aplicación sencilla que gestiona una base de datos almacenando una lista de nombres. Es decir que la base de datos contendrá unicamente una tabla con dos campos el campo id que será la llave primaria y el campo nombreU, esto con la finalidad de que este primer ejercicio sea sencillo para quien por primera vez trabaja con SQLite y Kotlin.

En la vista de la aplicación tendremos unicamente cuatro elementos:

  • Textview con id tvMuestraNombre
  • EditText con id etNombre
  • Button con id btnAgregar
  • Button con id btnTodos

Para producir esa vista puede arrastrar los controles y colocar los constraints o reglas de diseño a cada uno o támbien puede agregar el código en su archivo activity_main.xml y eso automáticamente mostrara el diseño de la imagen.

A continuación se muestra el codigo del archivo activity_main.xml. Puede usar este código copiándolo y pegándolo en el archivo activity_main.xml de su proyecto propio y así observar el resultado que se muestra en la figura de arriba.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">
    <!--Este es el codigo del textView que servirá para mostrar el texto que introduzca el usuario -->
    <TextView
        android:id="@+id/tvMuestraNombre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/etNombre" />

    <!--
    Este es el codigo del editText etNombre ,
    este control permitira al usuario capturar el texto que se desea agregar a la bd
     -->
    <EditText
        android:id="@+id/etNombre"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Nombre"
        app:layout_constraintBottom_toTopOf="@+id/tvMuestraNombre"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
<!--Este es el codigo del boton btnAgregar que servirá para agregar un Registro a la bd -->
    <Button
        android:id="@+id/btnAgregar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:text="Agregar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btnTodos" />
    <!--Este es el codigo del boton btnTodos que servirá para Mostrar todos los registros de la bd -->
    <Button
        android:id="@+id/btnTodos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:text="Mostrar todos"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/btnAgregar"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Hasta este momento solo se tiene la vista de la aplicación puede ejecutarla para ver que funcione correctamente, sin embargo no tiene ninguna funcionalidad. Para darle funcionalidad se tendrá que escribir codigo en lenguaje Kotlin. Lo primero que se hará será crear una clase llamada Nombre.

En la siguientes imagenes mostramos como:

Aparecerá una ventana como esta:

Seleccione Class y en donde dice Name escriba el nombre de la clase. La clase se llamará Nombre, presione enter.

Hecho esto se visualizará en pantalla la nueva clase lista para editar.

Este será el código de la clase Nombre.

class Nombre {
   var id: Int = 0
    var NombreUsuario: String? = null
   constructor(id: Int, nombre: String) {
        this.id = id
        this.NombreUsuario = nombre
    }
   constructor(nombre: String) {
        this.NombreUsuario = nombre
    }
}
class Nombre {

    var id: Int = 0   //declara una variable id que será tipo entero con un valor inicial de 0
    var NombreUsuario: String? = null    //declara una variable String el simbolo ? se usa para
                               // indicar  que a la variable es posible asignarle valores nulos
    constructor(id: Int, nombre: String) { //constructor de la clase Nombre
        this.id = id
        this.NombreUsuario = nombre
    }
    constructor(nombre: String) { //sobrecarga del constructor de la clase Nombre
        this.NombreUsuario = nombre
    }
}

Después de agregado el modelo de la clase Nombre , se creará la clase ayudaDB, puede seguirse el mismo procedimiento que se utilizó al crear la clase Nombre.

El codigo de la clase ayudaDB será

import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
/*
existe una clase llamada SQLiteOpenHelper que ayuda a gestionar
el manejo de una base de datos la clase ayudaDB hereda de esa
clase para permitir acceder a los metodos de creacion de la bd
actualizacion , insercion y lectura de registros
 */
class ayudaDb (
    context: Context,
    factory: SQLiteDatabase.CursorFactory?) :
    SQLiteOpenHelper(context, DATABASE_NAME,
    factory, DATABASE_VERSION) {
    //metodo para crear la base de datos
        override fun onCreate(db: SQLiteDatabase) {
            val CREATE_PRODUCTS_TABLE = ("CREATE TABLE " +
                    TABLE_NAME + "("
                    + COLUMN_ID + " INTEGER PRIMARY KEY," +
                    COLUMN_NAME
                    + " TEXT" + ")")
            db.execSQL(CREATE_PRODUCTS_TABLE)
        }
        override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME)
            onCreate(db)
        }
    //metodo para agregar un registro a la tabla
        fun addName(n: Nombre) {
            val values = ContentValues()
            values.put(COLUMN_NAME,n.NombreUsuario)
            val db = this.writableDatabase
            db.insert(TABLE_NAME, null, values)
            db.close()
        }
    //metodo para obtener los registros de la tabla
        fun getAllName(): Cursor? {
            val db = this.readableDatabase
            return db.rawQuery("SELECT * FROM $TABLE_NAME", null)
        }
        companion object {  //crea un objeto companion puede leer acerca de ellos
                           //en https://devexperto.com/object-kotlin-singleton/
                        //https://rubentejera.com/companion-object-en-kotlin/
            private val DATABASE_VERSION = 1
            private val DATABASE_NAME = "nombres.db"
            val TABLE_NAME = "tnombres"
            val COLUMN_ID = "_id"
            val COLUMN_NAME = "nombreU"
        }
    }
}

Finalmente editaremos el archivo MainActivity.kt que ya se encuentra en el proyecto.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
      /*el siguiente bloque maneja lo que ocurre al tocar
       *el boton Agregar */
        btnAgregar.setOnClickListener {
            val dbHandler = ayudaDb(this, null)
            val user = Nombre(etNombre.text.toString())
            dbHandler.addName(user)
            Toast.makeText(this, "SE agregó a la base de datos a: "+ etNombre.text.toString() , Toast.LENGTH_LONG).show()
            etNombre.setText("")
        }
        /*el siguiente bloque maneja lo que ocurre al tocar
        * el boton Mostrar Todos*/
        btnTodos.setOnClickListener {
            tvMuestraNombre.text = ""
            val dbHandler = ayudaDb(this, null)
            val cursor = dbHandler.getAllName()
            if (cursor != null) {

                    cursor!!.moveToFirst()
                    tvMuestraNombre.append((cursor.getString(cursor.getColumnIndex(ayudaDb.COLUMN_NAME))))
                    while (cursor.moveToNext()) {
                        tvMuestraNombre.append((cursor.getString(cursor.getColumnIndex(ayudaDb.COLUMN_NAME))))
                        tvMuestraNombre.append(System.getProperty("line.separator"));

                    }
                cursor.close()
                }


        }
    }
}

Con esto se tendría terminado el ejemplo, puede ejecutarse el proyecto y observar su funcionamiento. Los datos de SQLite se almacenarán en el teléfono de forma que cuando cierre la aplicación estos no se perderán.

3.- Primer proyecto en android studio.

Compartelo:

Para crear un proyecto nuevo tendremos que ir al menú File—->New—–>New Project



Despues aparecerá una ventana solicitando al usuario el tipo de plantilla a utilizar para el proyecto, seleccione empty activity y de clic en Siguiente.



Se mostrará la siguiente pantalla

Coloque nombre a su aplicación , puede tambien cambiar la ruta del proyecto si así lo desea.

Respecto a la casilla minimum SDK es importante mencionar que en este ejemplo el lenguaje a utilizar será kotlin y que el sdk que se utilizará será la version API 24 (android nougat). Se seleccionó esta version del sdk porque el teléfono con el cual se harán las pruebas contiene precisamente esa versión del sistema operativo, si se selecciona otra version no funcionará la ejecución correctamente.

Si usted va utilizar el Telefono virtual o android virtual device puede seleccionar la versión mas reciente de android.

Si va utilizar su telefono para hacer pruebas investigue la version de su sistema operativo android y seleccione esa versión en la casilla minimum sdk.

De clic en finish, de ser necesario android instalará el sdk que seleccionó lo cual podría tardar varios minutos dependiendo de la velocidad de su conexión a internet.



Una vez creado el proyecto se mostrará el entorno de trabajo de android studio. Se han incluido en la imagen descripciones a las secciones del entorno que se consideran importantes expanda la imagen y lea cuidadosamente.

Si se encuentra en esta pantalla y ya tiene conectado y configurado su teléfono virtual o físico puede dar clic icono ejecutar para construir el proyecto e instalarlo en su dispositivo.

El progreso de la construcción puede observarse en la barra de estado(parte inferior de la pantalla). Una vez terminado(finished) puede ir a su dispositivo virtual y ver la aplicación.

La aplicación deberá mostrarse correctamente en su dispositivo virtual.



Si tiene duda sobre como conectar su teléfono a android studio puede ver los siguientes videos.

2.- Descarga e instalación de android studio

Compartelo:

Android Studio es el IDE oficial de Google para el desarrollo de aplicaciones para Android, basado en IntelliJ IDEA.

Para instalar android studio es necesario contar con los siguientes requisitos:

  • Microsoft® Windows® 7/8/10 (64-bit)
  • 3 GB RAM minimo, 8 GB RAM recomendado.
  • 2 GB de espacio en disco, 4 GB recomendado.
  • Conexión a internet

Google ofrece Android Studio para Windows, Mac OS X y Linux. Para descargarlo puede hacerse desde el sitio oficial: descargar Android Studio

Una vez realizada la descarga inicial debe ejecutarse el archivo descargado , puede variar el nombre dependiendo de la versión en este ejemplo se llama android-studio-ide-181.5056338-windows.exe. El instalador desplegara en pantalla el siguiente cuadro de dialogo:

De clic en siguiente , despues aparecera una ventana en donde debe elegirse los componentes a instalar , puede desmarcar o marcar la instalación de android virtual device. Android virtual device permite crear un telefono virtual para ejecutar las aplicaciones compiladas en android studio, al compilar los programas android studio cargara el paquete en el telefono virtual y mostrara el programa que se ha compilado. Si no lo instala puede hacer pruebas directamente con su telefono android conectado a la computadora.

El android virtual device ocupa bastante espacio en disco y requiere al menos 1gb de memoria ram adicional para ejecutarse, por lo que esta podría alentarse mucho al tener el telefono virtual en ejecucion.

Para usar el android virtual device es necesario tener activada la virtualizacion del procesador (esto se hace desde el setup o bios de la tarjeta madre de la computadora) y tener activada las opciones de virtualizacion en el sistema operativo windows(esto se realiza yendo a la seccion de caracteristicas de windows).

En mi caso particular instalé el android virtual device y lo configuré correctamente sin embargo la ejecución de el dispositivo virtual implicó demasiado consumo de recursos y dadas las caracteristicas de mi equipo de computo preferí utilizar mi telefono celular para ejecutar los programas.

De clic en siguiente.

Despues aparecera una ventana para seleccionar la carpeta en la que se instalará android studio.

De clic en siguiente.

El instalador preguntará desde que menú quiere acceder al android studio.

De clic en siguiente.

Después aparecerá una ventana mostrando el progreso de la instalación .

Una vez terminada la instalación ejecute android studio.

La primera vez que se ejecute android studio mostrara un cuadro de dialogo que dice instalacion completada y pregunta al usuario si desea importar configuraciones anteriores. De clic en ok.

Despues se mostrara una pantalla con el logotipo de android, y posteriormente android studio comenzará a descargar algunos componentes adicionales.

Despues se presentara el siguiente cuadro de dialogo.

De clic en siguiente.

Despues aparece una ventana para seleccionar el tipo de instalación.

Seleccione estándar y de clic en siguiente.

Se muestra otra ventana en la que puede seleccionarse el tipo de interfaz de usuario.

De clic en siguiente.

Se muestra la siguiente ventana con los componentes a instalar

De clic en Finalizar.

 Android comenzará el proceso de descarga de componentes el cual tendrá un tiempo proporcional a la velocidad de su conexión a internet.

Una vez terminado el proceso el programa de instalación mostrará un resumen con los componentes instalados, mostrando en color rojo aquellos componentes con los que tuvo problemas. Es común que muestre que la computadora no soporta la virtualización la cual servirá para ejecutar los programas, si tiene un dispositivo android puede ejecutar los programas conectando su telefono al equipo de computo, si no tiene un dispositivo android será necesario habilitar la virtualizacion en su equipo de computo.

Con esto ha terminado el proceso de instalación, sin embargo al crear el primer proyecto se descargaran algunos componentes mas dependiendo del proyecto que se trate.

1.- Introducción

Compartelo:

Hoy un gran sector de la población utiliza un smartphone  es usado para comunicarse, comprar, vender o, incluso, buscar trabajo. Esto a abierto un nuevo campo de mercado para los desarrolladores de software ya que muchas de las empresas buscan alcanzar a sus clientes utilizando estas aplicaciones.

Contar con aplicaciones móviles es una necesidad para las empresas y una ventaja para los profesionales del software. No hay más que mirar las estadísticas.

En 2020 aproximadamente el 60% de la poblacion mundial utiliza internet , el 52% de ellos lo hace através de su telefono celular.

México cuenta al 2019 con 74 millones de personas utilizando internet de las cuales más del 90% lo hace através de su celular

Android se mantiene como lider en el mercado de sistemas operativos móviles. En Europa, según Statcounter, Android copa el 71,77% de dispositivos, frente al 27,72% de iOS.

Como vemos la demanda es muy amplia y mantiene un crecimiento constante pero también es cierto que en la actualidad hay cada vez más competencia en el mundo del desarrollo.

Existe también una amplia variedad de tecnologías que sirven al próposito del desarrollo de aplicaciones móviles. y podemosa gruparlas en las siguientes categorías:

  1. Desarrollo de sitios web con HML5 responsive
  2. Desarrollo de sitios web para móviles utilizando HTML5
  3. Desarrollo aplicaciones web para dispositivos utilizando HTML5
  4. Desarrollo de aplicaciones nativas para dispositivos utilizando HTML5
  5. Diseño de aplicaciones nativas para dispositivos (Android, iOS, Windows Phone, etc.)

A continuación se explican las características mas importantes que distinguen a cada una de las categorías mencionadas.

1. Sitio web HTML5 Responsive

Esta técnica permite diseñar aplicaciones web que se adaptan a las capacidades de visualización de los dispositivos, reorganizando los elementos de pantalla para que puedan ser accedidos desde cualquier dispositivo. Se desarrolla un único sitio web que es accedido a través del navegador.

La limitación más obvia es que no se aprovechan las capacidades de ningún dispositivo, ya que el diseño debe ser generalista y no puede incluir ninguna funcionalidad específica. El sitio web es accesible desde cualquier dispositivo, pero la experiencia de usuario no es óptima para ninguno de ellos.

2. Sitio web móvil con HTML5

A través de esta tecnología se diseñan sitios web específicos para dispositivos móviles, redirigiendo las peticiones a una URL diferente a la del sitio web tradicional. El sitio web móvil es diseñado de acuerdo a las características de los dispositivos, enfocando su construcción a la usabilidad de los contenidos, y los dispositivos acceden mediante el navegador web.

La limitación de este tipo de soluciones se basa en el empleo del navegador como software de visualización, lo que restringe el acceso a características específicas de los dispositivos. Asimismo, al tratarse de una URL, el acceso de los usuarios al servicio suele ser más errático, ya que no disponen de una aplicación catalogada en los diferentes Markets .

Existen diferentes frameworks web para poner en práctica esta tecnología (JQuery Mobile, Sencha Touch, Ember.js…)

3. Aplicación web móvil con HTML5

Esta tecnología es parecida a la anterior, pero se diferencía en que en este caso se empaqueta una aplicación nativa para cada tienda (playStore, Windows Store,…) que se basa en la inclusión un marco de navegación que accede al sitio web móvil.

4. Aplicación nativa con HTML5

Este desarrollo de aplicaciones nativas que no usan el navegador para mostrar los contenidos al usuario, puede ser realizado usando tecnologías de desarrollo HTML5. Las cuales permiten desarrollar una única vez y distribuir la aplicación para los diferentes sistemas operativos (Android, iOS…). Asimismo, ponen a disposición del desarrollador algunas de las características específicas de los dispositivos que no eran alcanzables en las alternativas anteriores.

Las limitaciones de esto radican en que no se pueden utilizar algunas de las características específicas del dispositivo (como la grabación de voz) o la toma de fotografías, ya que aún no están soportadas en los diferentes intérpretes de HTML5. Asimismo, la experiencia de usuario todavía no alcanza la calidad de las aplicaciones nativas.

Existen diferentes frameworks(PhoneGap, AppCelerator) que permiten construir este tipo de aplicaciones, aunque el conocimiento en JavaScript del desarrollador debe ser elevado.

5. Aplicación nativa

Las aplicaciones nativas se construyen empleando los propios entornos de desarrollo facilitados por los fabricantes del sistema operativo (SDK de android, SDK de IOS, etc) y se programa en el lenguaje específico del dispositivo (Java, Objective-C…). Estas aplicaciones pueden ejecutarse en diferentes versiones del sistema operativo.

Estas aplicaciones son mejores en el sentido de que aprovechan al máximo las capacidades de un dispositivo móvil , sin embargo el mayor inconveniente de este tipo de aplicaciones es el costo de desarrollo que implican, ya que es necesario volver a codificar la aplicación para cada sistema operativo en el que se quiere distribuir. Incluso a veces es necesario realizar versiones específicas para diferentes dispositivos o versiones del sistema operativo.

En el contenido de este curso nos centraremos en el desarrollo nativo utilizando android studio y el lenguaje de programación kotlin.