Bases+de+datos,+acelerometros+y+multitouch+en+Android

toc =Acelerómetros=

Pueden proporcionarnos información referente al movimiento del dispositivo y su orientación. El dispositivo cuenta con tres ejes, situados como se observa en la imagen.



Mediante los valores proporcionados por estos tres ejes, es posible detectar los movimientos del dispositivo y actuar en consecuencia.

=Multitouch= Esta función permite detectar más de un dedo tocando la pantalla, informándonos así mismo de las posiciones en las que se hace y de la acción realizada. El número máximo de dedos que se pueden detectar depende del dispositivo, por ejemplo, la tablet Acer Iconia B1 detecta hasta 5 dedos.

Estos //dedos// cuentan con un ID asignado, que nos permite identificarlos hasta que se levantan de la pantalla. Esto quiere decir que una vez el dedo ha dejado de tocar la pantalla, se pierde su identificador, que puede ser asignado a otro dedo nuevo. Así mismo, no es posible determinar qué dedo es el que realiza la acción, simplemente que //un dedo// la hace.

=Bases de Datos =

Todos los dispositivos Android soportan el uso de bases de datos SQLite sin necesidad de una configuración previa o software adicional. Para su uso, tan solo es necesario definir las sentencias necesarias para su creación, actualización, eliminación, etc; posteriormente, la base de datos sera gestionada por el sistema operativo.

Por defecto, las bases de datos en Android se guardan en la carpeta //DATA/data/APP_NAME/databases/DATABASENAME//, donde //APP_NAME// es el nombre de la aplicación, /DATABASENAME/ el nombre de la base de datos y //DATA// es el directorio devuelto por la sentencia code format="java" Environment.getDataDirectory code

=Aplicación de ejemplo=

El código completo de esta aplicación puede consultarse en github y una documentación de cada clase y método se encueentra disponible aquí

Acelerometro
Para dar un ejemplo sencillo de los acelerómetros hemos realizado una pequeña //Activity// que nos modifica indica en la pantalla si el dispositivo se encuentra en posición vertical u horizontal, así como en el caso de que no se pueda determinar. Ésta, implementará la interfaz //SensorEventListener// que nos permite actuar ante los cambios que sufra el sensor escogido, en nuestro caso, el acelerómetro.

En primer lugar, en el método //onCreate//, es necesario obtener un controlador para los acelerómetros, así como comprobar que nuestro dispositivo dispone de ellos. Esto se hace mediante el siguiente código: code format="java" public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); oldorientation = Surface.ROTATION_0; setContentView(R.layout.activity_accelerometer_otro); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).size == 0) setContentView(R.layout.activity_accelerometer_nothing); else { mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } } code

A continuación, en los métodos //onResume// y //onPause// se asocia el controlador con el sensor y se elimina esta asociación respectivamente. Esto se hace para evitar gastar batería innecesariamente cuando la aplicación se encuentra en segundo plano, así como para liberar el recurso en caso de que otra aplicación desee usarlo. code format="java" protected void onResume { super.onResume; mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause { super.onPause; mSensorManager.unregisterListener(this); } code

Finalmente, en el método //onSensorChanged//, se lleva a cabo el análisis de los datos obtenidos del acelerómetro y se determina la nueva orientación del mismo.

El código completo de esta Activity se puede consultar aquí.

Multitouch
En nuestra aplicación para mostrar el uso del Multitouch, se muestra por pantalla un valor booleano (//true// o //false//) que nos indica si ese //ID// está actualmente tocando la pantalla, es decir, si está ocupado. A continuación se muestran las coordenadas //x// e //y// del último punto de la pantalla donde se detectó el dedo. Aunque la mayoría de los dispositivos no llegan a tal número, en nuestra aplicación hemos soportado hasta 10 dedos sobre la pantalla al mismo tiempo.

Para la realización de esta aplicación, en primer lugar en el método //onCreate// se añade un //OnTouchListener// sobre la vista que se va a utilizar, para que se puedan detectar las pulsaciones. Hay que decir que nuestra Activity implementa la interfaz //OnTouchListener// que nos permite detectar eventos de la pantalla. code format="java" public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_multitouch); textView = new TextView(this); textView = (TextView) findViewById(R.id.dedostext); View v= (View) findViewById(R.id.Multitouchact); v.setOnTouchListener(this); } code

Finalmente, en el método //onTouch// se detecta, a partir del parametro //event// (de tipo //MotionEvent//) la acción realizada, el índice del evento y el //id// del dedo. Para cada tipo de acción se ha realizado una acción determinada diferenciando entre: tocar la pantalla, levantar el dedo o moverlo por la pantalla.

El código completo de esta Activity se puede consultar aquí.

Base de datos
Para mostrar el funcionamiento de esta característica de Android, se ha realizado una pequeña agenda que permite almacenar un nombres y correos electrónicos, consultarlos o borrarlos. A continuación, se van a mostrar algunas de las clases y métodos realizados.

DatabaseHelper
Esta clase, que hereda de //SQLiteOpenHelper// permite manipular una base de datos de una forma relativamente sencilla.

En primer lugar se declaran las variables estáticas con los nombres de la base de datos y de los atributos, así como un número de versión (que puede ser de utilidad para futuras actualizaciones de la aplicación) y la sentencia de creación de la base de la tabla.

Esta clase cuenta con tres métodos:

Constructor
Nos permite crear la base de datos llamando al constructor de //SQLiteOpenHelper// así como realizar las acciones que determinemos oportunas (si ya existe una base de datos con las mismas características, esta no se crea. code format="java" public DatabaseHelper(Context context) {   super(context, NOMBRE_BASEDATOS, null, VERSION_BASEDATOS); } code

onCreate
En este método se deben crear todas las tablas de la base de datos mediante la ejecución de sentencias SQL sobre la base de datos que se le pasa como parámetro. En nuestro caso, esto solo immplica la creación de la tabla //contactos//: code format="java" public void onCreate(SQLiteDatabase db) { db.execSQL(CREAR_BASEDATOS); } code

onUpgrade
Este método se utiliza para actualizar la base de datos. En general solo es llamado tras una actualización de la aplicación, pues se debe de encargar de modificar la versión de la base de datos y limpiar y recrear la base de datos si es necesario.

En nuestro ejemplo, tan solo elimina la tabla actual y vuelve a crearla vacía. code format="java" public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXITST contactos"); onCreate(db); } code

El código completo de esta clase se puede consultar aquí

AdaptardorBD
Esta clase contiene todos los métodos necesarios para acceder a la base de datos, lo que implica que siempre que se desee acceder a dicha base de datos, será necesario tener un objeto de este tipo. Aunque esta clase no es estrictamente necesaria, pues todas las operaciones se podrían realizar directamente sobre la base de datos, es ampliamente usada pues nos permite un nivel de abstracción mayor evitando que cambios internos en la base de datos afecten a toda la aplicación.

Esta clase, recibe en el constructor el contexto de la Activity y crea un objeto interno del tipo DatabaseHelper que le permitirá acceder a la base de datos. Así mismo, mediante las llamadas /open/ y /close/ respectivamente, abre y cierra la base de datos. El cierre es necesario para que otra activity pueda hacer uso de la base de datos si es necesario.

También debe contener todos los métodos necesarios para las operaciones deseadas sobre la base de datos, como añadir, eliminar u obtener los contactos.

Esta clase es la que lleva a cabo todas las operaciones sobre la base de datos, ya sea mediante sentencias /SQL/ o métodos como /insert/ o /delete/, proporcionados por la clase /SQLiteDatabase/ de android.

Hay que remarcar que cada vez que se obtienen datos de una base de datos en android, estos son proporcionados mediante un cursor con el que podemos iterar por los mismos, evitando así que deban ser cargados totalmente en memoria como una lista u otro objeto.

Existen tres métodos para ejecutar sentencias /SQL/ en Android:

code format="java" query(String table, String[] columns, String selection, String[]selectionArgs, String groupBy, String having, String orderBy, String limit); code
 * 1) __execSQL:__ que recibe la sentencia completa como string.
 * 2) __rawQuery:__ que utiliza un estilo similar al /printf/ de C, añadiedo un string con /?/ en los lugares donde deben ir los parámetros que se pasan a continuación como un vector de strings.
 * 3) __query:__ que permite realizar consultas siguiento la siguiente definición de parámetros.

Finalmente, los métodos /insert/ y /delete/ tienen la siguiente estructura: code format="java" insert(String table, String nullColumnHack, ContentValues values); delete(String table, String whereClause, String[] whereArgs) // whereClause y whereArgs usan el estilo de query code

El código completo de esta clase se puede consultar aquí

=Referencias=