Programación Android, Base de Datos I (Modelo-Vista-Controlador)

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

Android SQLite

En Android se utiliza como sistema gestor de base de datos SQLite. SQLite no es una base de datos cliente-servidor, sino que se enlaza con el propio programa, integrándose como una parte más del mismo.

Para poder gestionar nuestra propia base de datos en nuestra aplicación Android nos proporciona todas las herramientas que necesitamos, de manera que podamos realizar todas las tareas de forma sencilla.

Sin embargo antes de entrar a fondo en cómo gestionar nuestra base de datos, vamos a explicar cómo funciona el patrón MVC (Modelo Vista Controlador) en Android.

Modelo Vista Controlador

Para aquellos que no estén familiarizados con el MVC, éste es un patrón que divide nuestra aplicación en tres niveles distintos, uno que representa a la interfaz gráfica (Vista), otro que representa el tratamiento de datos (Modelo) y otro que se encarga de toda la lógica que se tiene que llevar a cabo por la aplicación (Controlador). Esto se hace para permitir una mayor portabilidad de una aplicación, e incluso facilitar su mantenimiento. Pues si lo que queremos es modificar la apariencia de la aplicación sólo prestaremos atención a la capa de la Vista, si queremos cambiar de sistema de almacenamiento de datos sólo tendremos que prestar atención a la capa del Modelo, y si lo que queremos es portar la aplicación a otra plataforma lo que haremos será modificar la capa del Controlador, al igual que si queremos modificar el código para optimizar rendimiento.

 

Esquema MVC
Esquema MVC

Como vemos en la imagen, la forma en que debe trabajar este patrón es conectando la Vista, que es la parte visible para el usuario de la aplicación, con un Controlador, que recibirá los datos de la Vista para tratarlos, o se los mandará a la Vista para mostrarlos al usuario. A su vez este Controlador será el que conecte con la capa Modelo, para poder guardar los datos recibidos desde la Vista, o para solicitar los datos que queremos enviar a la Vista.

En android tenemos un MVC un tanto peculiar, pues nos encontramos con las Vistas, que creamos en XML, y cada una de estas vistas tiene asociada una Activity que la gestiona, sin embargo si tenemos una aplicación con 4 Activities distintas, y todas necesitan acceder a los datos no debemos acceder desde cada una de las Activity al Modelo, aunque pertenecen al nivel del Controlador. En lugar de esto todas las Activities que necesiten conectar con el Modelo van a pasar por un Controlador intermedio.

Vamos a explicar esto más detalladamente. En Android existe una clase que es la encargada de la gestión de toda la aplicación, si vamos al Manifiesto podremos ver que cuando hemos creado nuevas Activities las hemos ido introduciendo dentro de una etiqueta Application:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.proyectosimio.proyecto.Main"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Pues bien, en Java también podemos hacer referencia a una clase Application, que será la que controlará a las Activities, de manera que todo el tráfico entre el Modelo y las Activities pasarán a través de esta clase. Por lo tanto el esquema real del MVC en Android quedaría así:

 

Android MVC
Android MVC

Por lo tanto, antes de empezar a crear nuestra base de datos, definiremos nuestra clase Application, que utilizaremos, como hemos dicho, para canalizar todo el tráfico entre las Activities y el Modelo.

Sobreescribiendo Application

Para ello vamos a crear una nueva clase. Le damos al botón derecho sobre el Package que tenemos en la estructura de nuestro proyecto, New->Class y le damos un nombre a nuestra nueva clase que haga referencia a su función. Es una buena práctica crear diferentes packages para los distintos tipos de clases que vayamos a crear, por ejemplo un package para las Activities, otro package.modelo para las clases que representen los datos que necesitemos manejar (por ejemplo una clase Coche), etc.

Una vez que tenemos la clase creada, le diremos que extienda de Application:

public class MyApplication extends Application {
}

Y por último tenemos que indicar en el manifiest.xml que esta será la clase que va a gestionar la aplicación, para ello utilizaremos el atributo Android:Name de la etiqueta Application:

<application
    android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

Llamando a Application

Una vez que tenemos esto hecho, ya podremos hacer llamadas a los métodos que necesitemos de esta clase Application que hemos definido. Para poder hacerlo las Activities ya cuentan con un método que llama a la clase Application, que es getApplication(), que nos va a devolver precisamente la clase Application. Sin embargo para poder hacer uso de los métodos que definamos en nuestra clase vamos a tener que hacer un casting al tipo de la clase que nosotros hemos definido como Application, y a partir de ahí podremos hacer la llamada a los métodos que contenga la clase. Para que quede más claro un ejemplo sería:

((MyApplication)getApplication()).metodoDeNuestraClaseApplication();

Con esto lo que hacemos es:

(MyApplication)getApplication() // Casting de Application a MyApplication.

((MyApplication)getApplication()).metodo() // Accedemos a los métodos que contiene
                                           // MyApplication.

A su vez, estos métodos harán las llamadas necesarias a la clase Modelo que tengamos, por lo que la definición del método en la clase MyApplication sería, por ejemplo:

// Llamada desde la Activity al método de Application
((MyApplication)getApplication()).getNombre()

// Código del método en MyApplication
String getNombre(int idContacto) {
    return modelo.getNombre(idContacto);
}

En el código del ejemplo en el lugar de modelo pondríamos el objeto que representa a la capa Modelo del MVC, que como dijimos es el encargado de almacenar los datos recibidos y devolver los datos necesarios.

En la próxima publicación empezaremos a configurar la base de datos de nuestra aplicación.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

6 thoughts on “Programación Android, Base de Datos I (Modelo-Vista-Controlador)

  1. Muchas gracias por el post, es muy claro. Una pregunta, si mi aplicación no requiere el almacenamiento de datos (al menos no por ahora) o si los datos que se almacenan es con SharedPreferences de forma temporal para compartir información entre actividades, puedo decir que mi patrón sigue siendo MVC?

    Gracias

    1. Si no necesitas usar datos almacenados estrictamente hablando no harías uso del patrón MVC, ya que sólo estarías usando las capas de las vistas y del controlador, pero no el modelo.

      Si usas SharedPreferences pero en lugar de crear una capa que se encargue de guardar, leer y tratar los datos, lo haces directamente desde la Activity o el Fragment, en realidad estás tratando datos en una capa que no es el modelo, por lo tanto, bajo mi punto de vista, tampoco estarías haciendo uso del patrón MVC.

      Un saludo.

  2. Muchas gracias por tu post! Sumamente aclaratorio.
    Solo decir que en el ultimo trozo de códico, en la linea 2 hay que invocar el método getNombre() pasandole el argumento int, para que sea coherente con la definicion del método y no de error de compilación:

    // Llamada desde la Activity al método de Application
    ((MyApplication)getApplication()).getNombre(35);

    Gracias!

Deja un comentario