Los dispositivos Android disponen de un servidor de base de datos SQLite interno, que posibilita a las aplicaciones tener una base de datos propia.

Para gestionar la base de datos es necesario crear una subclase de SQLiteOpenHelper. Esa subclase que debes crear permitirá a la aplicación crear la base datos si no existiera y abrirla para poder usarla en cualquier clase de la aplicación.

Una manera sencilla de crear la subclase es la que se indica a continuación. Usar la opción New > Class en el menú contextual del paquete de la aplicación.

sql01

Indicar el nombre que deseas asignar a la clase y en el campo Superclass debes especificar la clase android.database.sqlite.SQLiteOpenHelper. Puedes ayudar del botón Browse para buscar el nombre de la clase indicando el texto SQLiteOpenHelper.

sql02

El cóigo que se genera, si no cambia ninguna otra opción, muestra un error en el nombre de la clase, indicando que hace falta tener un método constructor de la superclase. Puedes utilizar el primer método que aparece en la lista que se muestra al hacer clic en el error.

sql03 

Finalmente debes obtener un código similar al siguiente:

package com.example.ejemplosql;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class BDContactosHelper extends SQLiteOpenHelper {

    public BDContactosHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

En el método onCreate debes utilizar el método execSQL sobre el objeto db de la clase SQLiteDatabase que se pasa por parámetro, para ejecutar las sentencia SQL que correspondan a la creación de las tablas necesarias en la base de datos.

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sqlCreate = "CREATE TABLE contactos (" +
                "id INTEGER PRIMARY KEY" +
                ", nombre VARCHAR(50)" +
                ", apellidos VARCHAR(50)" +
                ", telefono VARCHAR(20)" +
                ", email VARCHAR(30)" +
                ")";
        db.execSQL(sqlCreate);
    }

En el método onUpgrade se deberían indicarían las instrucciones necesarias si se va a utilizar una nueva versión de la base de datos. Normalmente se haría volcando los datos a otras tablas auxiliares, crear las tablas con la nueva estructura y volver a recuperar los datos

Como ejemplo de uso podemos ver el código de una Activity que se conecta con la base de datos bd_contactos en el método onCreate, y cierra la conexión en el método onDestroy. El método onClickBotonInsertar realiza la inserción de un registro en la base de datos, y el método onClickBotonConsultar obtiene los datos del registro que tenga el identificador 1.

package com.example.ejemplosql;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    private static final String NOMBRE_BD = "bd_contactos";
    private static final int VERSION_BD = 1;
    // Se declara la BD como una propiedad estática de la clase para poder usarla desde cualquier otra clase
    protected static SQLiteDatabase bdContactos;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Abrir la base de datos, creándola si es necesario
        BDContactosHelper bdContactosHelper = new BDContactosHelper(this, NOMBRE_BD, null, VERSION_BD);
        bdContactos = bdContactosHelper.getWritableDatabase();
    }
    
    public void onClickBotonInsertar(View v) {
        // Se ponen estos datos de manera fija como ejemplo
        String nombre = "Fulano";
        String apellidos = "Mengano";
        String telefono = "823784832";
        String email = "usuario @ servidor.com";
        
        //Comprobar si se ha abierto la base de datos
        if(bdContactos != null) {
            //Insertar datos en la base de datos
            bdContactos.execSQL("INSERT INTO contactos (nombre, apellidos, telefono, email) " +
                       "VALUES ('"+nombre+"', '"+apellidos+"', '"+telefono+"', '"+email+"')");
        }
    }
    
    public void onClickBotonConsultar(View v) {
        // Como ejemplo, se van a obtener los datos del contacto con id=1 
        int idContacto = 1;
        
        if(bdContactos != null) {            
            Cursor cursor = bdContactos.rawQuery("SELECT nombre,apellidos,telefono,email from contactos WHERE id="+idContacto, null);
            // Comprobar si se ha obtenido algún registro
            if(cursor.moveToNext()) {
                // Obtener el valor de cada columna según su número de orden en la consulta
                String nombre = cursor.getString(0);
                String apellidos = cursor.getString(1);
                String telefono = cursor.getString(2);
                String email = cursor.getString(3);
                // A partir de aquí, hacer lo que sea con los datos obtenidos
            }
        }
    }

    @Override
    protected void onDestroy() {
        if(bdContactos != null) {
            //Cerrar la base de datos si se había podido abrir
            bdContactos.close();
        }
        super.onDestroy();
    }

}

Para comprobar el estado de la base de datos en cualquier momento, puedes conectarte desde el símbolo del sistema al dispositivo Android, usando el comando adb shell. Con la herramienta sqlite3 puedes conectarte con la base de datos que indiques, y luego puedes usar cualquier sentencia SQL.

sql04