Diferencia entre revisiones de «Usuario:ManuelRomero/Android/BBDD»

De WikiEducator
Saltar a: navegación, buscar
(SQLiteDatabase)
Línea 92: Línea 92:
 
#File file
 
#File file
  
En realidad el uso de ambos métodos es similar con el hecho de que en el método '''''openOrCreateDatabase(...)''''' asumimos el flag '''''CREATE_IF_NECESSARY'''''
+
*En realidad el uso de ambos métodos es similar con el hecho de que en el método '''''openOrCreateDatabase(...)''''' asumimos el flag '''''CREATE_IF_NECESSARY'''''
 +
*Ambos métodos pueden lanzar una excepción '''''SQLiteException''''' En caso de no abrir/crear la base de datos que hay que capturar
 +
 
 
Ejemplo
 
Ejemplo
 
<source lang=java>
 
<source lang=java>
Línea 99: Línea 101:
 
import android.app.Activity;
 
import android.app.Activity;
 
import android.database.sqlite.SQLiteDatabase;
 
import android.database.sqlite.SQLiteDatabase;
 +
import android.os.Bundle;
 +
import android.os.Environment;
 +
import android.util.Log;
 
import android.widget.Toast;
 
import android.widget.Toast;
  
 
public class Contactos extends Activity {
 
public class Contactos extends Activity {
    private static final String TAG = "bdagenda"; 
+
private static final String DATABASE_NAME = "contactos.db";
    private static final String DATABASE_PATH = "/data/data/com.example.agenda/databases/";
+
private String nombreBD;
    private static final String DATABASE_NAME = "contactos.db";
+
private SQLiteDatabase baseDatos;
    private String nombreBD=DATABASE_PATH+DATABASE_NAME;
+
  
private SQLiteDatabase baseDatos;
 
 
 
private String crearTablaContacto= "create table if not exists "   
 
private String crearTablaContacto= "create table if not exists "   
 
  + " contacto (codigo integer primary key autoincrement, "   
 
  + " contacto (codigo integer primary key autoincrement, "   
Línea 116: Línea 118:
 
     public void onCreate(Bundle savedInstanceState) {
 
     public void onCreate(Bundle savedInstanceState) {
 
         super.onCreate(savedInstanceState);
 
         super.onCreate(savedInstanceState);
 +
        /**
 +
          Construimos el path para crear la base de datos asegurandonos de la ubicación de los ficheros
 +
          por defecto será /data/data/com.example.agenda/...
 +
        */
 +
        nombreBD=  Environment.getDataDirectory()+"/data/com.example.agenda/"+DATABASE_NAME;
 
         setContentView(R.layout.layout_contactos);
 
         setContentView(R.layout.layout_contactos);
 
         if (abrirBaseDatos()){
 
         if (abrirBaseDatos()){
        Toast.makeText(this,"Base de datos Abierta ok!!",Toast.LENGTH_LONG).show();
+
          Toast.makeText(this,"Base de datos Abierta ok!! en "+nombreBD,Toast.LENGTH_LONG).show();
 
         }else{
 
         }else{
        Toast.makeText(this,"ERROR no se ha podido abrir la base de datos!!",Toast.LENGTH_LONG).show();
+
            Toast.makeText(this,"ERROR no se ha podido abrir la base de datos!! "+nombreBD,Toast.LENGTH_LONG).show();
 
         }
 
         }
 
     }
 
     }
  
//Procedimiento para abrir la base de datos
+
    /**
  //si no existe se creará, también se creará la tabla contacto       
+
    * Método para crear o abrir la base de datos
+
    * Retorna un booleano indicando el éxito o fracaso de la acción
 +
    */
 
     private boolean abrirBaseDatos(){   
 
     private boolean abrirBaseDatos(){   
    try{   
+
        try{   
      baseDatos = SQLiteDatabase.openOrCreateDatabase(nombreBD, null);   
+
    baseDatos = SQLiteDatabase.openOrCreateDatabase(nombreBD, null);   
 
    // baseDatos = openDatabase(nombreBD,null,SQLiteDatabase.CREATE_IF_NECESSARY);
 
    // baseDatos = openDatabase(nombreBD,null,SQLiteDatabase.CREATE_IF_NECESSARY);
      baseDatos.execSQL(crearTablaContacto);   
+
    baseDatos.execSQL(crearTablaContacto);   
      return true;
+
    return true;
    }     
+
  }     
    catch (Exception e){   
+
  catch (SQLiteException e){   
      Log.i(TAG, "Error al abrir o crear la base de datos" + e);
+
    Log.i("BASE DATOS","Error al abrir o crear la base de datos" + e);
      return false;
+
    return false;
    }   
+
  }   
  }   
+
  }   
}
+
}//Fin de la clase Contactos
 
+
 
+
 
</source>
 
</source>

Revisión de 13:30 4 ene 2013

Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg




Introducción

Android dentro del API tiene funcionalidad para gestionar una base de datos SQLite
Esto hace que no requeramos ningún driver ni instalar un gestor de bases de datos adicional
SQLite es un motor de bases de datos con una características especiales que le hacen muy atractivas para determinados entornos
  1. Maneja archivos de pequeño tamaño.
  2. Requiere poco espacio en tiempo de ejecución (250MB apx)
  3. no necesita un servidor, no permite concurrencia, está basado en funciones no en servicios, lo que le permite presentar tiempos de respuestas rápidos.
  4. cumple el estándar SQL-92
  5. Es Open Source

Características importantes

  • Presenta los siguientes tipos de datos

Si escribes esto al editar... ...este será el resultado.

Tipos de datos en SQLite
Tipo Declaración del tipo
TEXTO "TEXT"
NUMERO "NUM"
ENTERO "INT"
REAL ""
  • No soporta otros tipos
  • No valida los valores o sea que podemos insertar cadenas de texto en un campo de enteros y el sistema no se queja

SQLite y Android

  • Acceder a la base de datos implica acceder al sistema de ficheros
  • Los ficheros que creemos por defecto se ubicarán el en siguiente directoiro

DATA/data/APP_NAME/databases/FILENAME.

DATA es el directorio donde ubica los ficheros Enviroment.getDataDirectory()
APP_NAME nombre de la aplicación
FILENAME es el nombre del fichero de la base de datos

El API SQLLite

  • El API para trabajar con base de datos está definido en los siguientes paquetes
android.database
contiene todas las clases para trabajar con bases de datos
android.database.sqlite
Aquí tenemos las clases específicas para trabajar con sqlite
  1. SQLiteClosable
  2. SQLiteCursor
  3. SQLiteDatabase
  4. SQLiteOpenHelper
  5. SQLiteProgram
  6. SQLiteQuery
  7. SQLiteQueryBuilder
  8. SQLiteStatement
  • Y las siguientes interfaces
  1. SQLiteCursorDriver
  2. SQLiteDatabase.CursorFactory
  3. SQLiteTransactionListener

Trabajar con Android y SQLLite

Para trabajar con una base de datos debemos realizar unos pasos clásicos

  1. Crear la base de datos y gestionarla
  2. Por crear la base de datos entendemos
    1. Definir la base de datos
    2. Definir su estructura (tablas y campos)
  3. Por gestionarla aludo al hecho de hacer operaciones básicas
    1. Insertar tuplas
    2. Borrar
    3. Modificar
    4. Consultar
  4. A continuacion vamos a ver como se realizan estas acciones con Android como lenguje y SQLLite como gestor de bases de datos relacional

Crear una base de datos

  • Para administar una base de datos tenemos la clase SQLiteDatabase
  • Tenemos dos métodos para abrir / crear una base de datos
  • La idea es si existe la base de datos la abro, y si no existe la creo
  • Tenemos dos manera de interoperar en esta manera
  1. Usando métodos concretos de la clase SQLiteDatabase concretamente openDatabase u openOrCreateDatabase
  2. Extendiendo la clase abstracta SQLOpenHelper que es la forma mas habitual y cómo de realizarlo.

SQLiteDatabase

Presenta los siguientes métodos para crear/abrir una base de datos

  1. openDatabase
  2. openOrCreateDatabase'

Los parámetros que se pueden pasar son los siguientes

  1. String path Es el path y nombre de la base de datos
  2. int flag especifica el modo en el que se abre/crea la base de datos. Sus valores se pueden combinar e.j. OPEN_READWRITE|CREATE_IF_NECESSARY (Especificamos los dos modos).
    1. OPEN_READWRITE
    2. OPEN_READONLY
    3. CREATE_IF_NECESSARY
    4. NO_LOCALIZED_COLLATORS.
  3. SQLLiteDatabase.CursorFactory factory
  4. DatabaseErrorHandler errorHandler
  5. File file
  • En realidad el uso de ambos métodos es similar con el hecho de que en el método openOrCreateDatabase(...) asumimos el flag CREATE_IF_NECESSARY
  • Ambos métodos pueden lanzar una excepción SQLiteException En caso de no abrir/crear la base de datos que hay que capturar

Ejemplo

package com.example.agenda;
 
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
 
public class Contactos extends Activity {
	private static final String DATABASE_NAME = "contactos.db";
	private String nombreBD;
	private SQLiteDatabase baseDatos;
 
	private String crearTablaContacto= "create table if not exists "  
		  + " contacto (codigo integer primary key autoincrement, "  
		  + " nombre text not null, telefono text not null unique);"; 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
           Construimos el path para crear la base de datos asegurandonos de la ubicación de los ficheros
           por defecto será /data/data/com.example.agenda/...
        */ 
        nombreBD=  Environment.getDataDirectory()+"/data/com.example.agenda/"+DATABASE_NAME;
        setContentView(R.layout.layout_contactos);
        if (abrirBaseDatos()){
           Toast.makeText(this,"Base de datos Abierta ok!! en "+nombreBD,Toast.LENGTH_LONG).show();
        }else{
             Toast.makeText(this,"ERROR no se ha podido abrir la base de datos!! "+nombreBD,Toast.LENGTH_LONG).show();
        }
    }
 
    /**
     * Método para crear o abrir la base de datos
     * Retorna un booleano indicando el éxito o fracaso de la acción
    */
    private boolean abrirBaseDatos(){   
         try{   
	     baseDatos = SQLiteDatabase.openOrCreateDatabase(nombreBD, null);   
	     // baseDatos = openDatabase(nombreBD,null,SQLiteDatabase.CREATE_IF_NECESSARY);
	     baseDatos.execSQL(crearTablaContacto);   
	     return true;
	  }    
	  catch (SQLiteException e){   
	     Log.i("BASE DATOS","Error al abrir o crear la base de datos" + e);
	     return false;
	  }   
   }  
}//Fin de la clase Contactos