Skip to content

Most visited

Recently visited

navigation

Cómo guardar datos en bases de datos SQL

Guardar datos en una base de datos es ideal para los datos estructurados o que se repiten, como la información de contacto. En esta clase, se supone que estás familiarizado con las bases de datos SQL en general y se brinda ayuda para que comiences a utilizar las bases de datos SQLite en Android. Las API (interfaces de programación de aplicaciones) que necesitarás para utilizar una base de datos en Android están disponibles en el paquete android.database.sqlite.

Definir un esquema y un contrato

Uno de los principios fundamentales de las bases de datos SQL es el esquema: una declaración formal de la manera en la que la base de datos está organizada. El esquema se refleja en las instrucciones SQL que utilizas para crear la base de datos. Tal vez te resulte útil crear una clase complementaria, denominada clase Contract, que especifica explícitamente el diseño del esquema de forma sistemática y autodocumentada.

Una clase Contract es un contenedor para constantes que definen nombres de URI (identificadores uniformes de recursos), tablas y columnas. La clase Contract te permite utilizar las mismas constantes en todas las otras clases del mismo paquete. Esto te permite cambiar el nombre de una columna en un lugar y que ese cambio se propague en todo el código.

Una forma adecuada de organizar una clase Contract es poner definiciones que sean globales para toda la base de datos en el nivel de raíz de la clase. Luego, hay que crear una clase interna para cada tabla que enumere las columnas.

Nota: Mediante la implementación de la interfaz BaseColumns, tu clase interna puede heredar un campo de clave principal llamado _ID cuya existencia preverán algunas clases de Android como los adaptadores de cursores. Esto no es obligatorio, pero puede ayudar a que la base de datos trabaje de forma armoniosa con el marco de Android.

Por ejemplo, este fragmento de código define el nombre de la tabla y los nombres de las columnas de una única tabla:

public final class FeedReaderContract {
    // To prevent someone from accidentally instantiating the contract class,
    // make the constructor private.
    private FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
    }
}

Crear una base de datos utilizando un asistente de SQL

Una vez que has definido el aspecto de la base de datos, debes implementar métodos para crear y mantener la base de datos y las tablas. Estas son algunas instrucciones típicas para crear y eliminar una tabla:

private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
    FeedEntry._ID + " INTEGER PRIMARY KEY," +
    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
    FeedEntry.COLUMN_NAME_SUBTITLE + TEXT_TYPE + " )";

private static final String SQL_DELETE_ENTRIES =
    "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

Al igual que los archivos que guardas en el almacenamiento interno del dispositivo, Android guarda la base de datos en el espacio privado del disco asociado con la aplicación. Los datos están seguros porque, de forma predeterminada, esta área no es accesible para otras aplicaciones.

Se encuentra disponible un útil conjunto de API en la clase SQLiteOpenHelper. Cuando uses esta clase para obtener referencias a tu base de datos, el sistema realizará las operaciones de creación y actualización de la base de datos, que pueden llevar bastante tiempo, solo cuando sea necesario y no durante el inicio de la app. Lo único que debes hacer es llamar a getWritableDatabase() o getReadableDatabase().

Nota: Debido a esta posibilidad de que lleven bastante tiempo, asegúrate de llamar a getWritableDatabase() o getReadableDatabase() en un subproceso en segundo plano, como con AsyncTask o IntentService.

Para usar SQLiteOpenHelper, crea una subclase que anule los métodos de callback onCreate(), onUpgrade() y onOpen(). También puedes implementar onDowngrade(), pero no es obligatorio.

A continuación, por ejemplo, se ofrece una implementación de SQLiteOpenHelper en la cual se usan algunos de los comandos que aparecen anteriormente:

public class FeedReaderDbHelper extends SQLiteOpenHelper {
    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "FeedReader.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // This database is only a cache for online data, so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

Para acceder a la base de datos, crea una instancia de la subclase de SQLiteOpenHelper:

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

Ingresar información en una base de datos

Inserta datos en la base de datos pasando un objeto ContentValues al método insert():

// Gets the data repository in write mode
SQLiteDatabase db = mDbHelper.getWritableDatabase();

// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);

// Insert the new row, returning the primary key value of the new row
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);

El primer argumento de insert() es simplemente el nombre de la tabla.

El segundo argumento indica al framework lo que debe hacer en caso de que el ContentValues esté vacío (es decir, no aplicaste put a ningún valor). Si especificas el nombre de una columna, el framework inserta una fila y fija el valor de esa columna en null. Si especificas null, como en este ejemplo de código, el framework no insertará una fila cuando no haya valores.

Leer información de una base de datos

Para leer de una base de datos, utiliza el método query() , y pasa tus criterios de selección y columnas deseadas. El método combina elementos de insert() y update(), excepto que la lista de columnas define los datos que deseas obtener, en lugar de los datos a insertar. Los resultados de la consulta se devuelven en un objeto Cursor.

SQLiteDatabase db = mDbHelper.getReadableDatabase();

// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
    FeedEntry._ID,
    FeedEntry.COLUMN_NAME_TITLE,
    FeedEntry.COLUMN_NAME_SUBTITLE
    };

// Filter results WHERE "title" = 'My Title'
String selection = FeedEntry.COLUMN_NAME_TITLE + " = ?";
String[] selectionArgs = { "My Title" };

// How you want the results sorted in the resulting Cursor
String sortOrder =
    FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";

Cursor c = db.query(
    FeedEntry.TABLE_NAME,                     // The table to query
    projection,                               // The columns to return
    selection,                                // The columns for the WHERE clause
    selectionArgs,                            // The values for the WHERE clause
    null,                                     // don't group the rows
    null,                                     // don't filter by row groups
    sortOrder                                 // The sort order
    );

Para ver una fila en el cursor, utiliza uno de los métodos de movimiento Cursor, a los que siempre debes llamar antes de comenzar a leer valores. Por lo general, debes comenzar llamando a moveToFirst(), que coloca la "posición de lectura" en la primera entrada de los resultados. En cada fila, puedes leer el valor de una columna llamando a uno de los métodos get del Cursor, como getString() o getLong(). Para cada uno de los métodos get, debes pasar la posición de índice de la columna que desea, que puedes obtener llamando a getColumnIndex() o getColumnIndexOrThrow(). Por ejemplo:

cursor.moveToFirst();
long itemId = cursor.getLong(
    cursor.getColumnIndexOrThrow(FeedEntry._ID)
);

Eliminar información de una base de datos

Para eliminar filas de una tabla, debes proporcionar los criterios de selección que identifican las filas. La Database API proporciona un mecanismo para crear criterios de selección que protegen contra ataques por inyección de código SQL. El mecanismo divide la especificación de la selección en una cláusula de la selección y los argumentos de la selección. La cláusula define las columnas a comprobar, y también permite combinar pruebas de columnas . Los argumentos son los valores en los que se realizan pruebas, y están enlazados en la cláusula. Dado que el resultado no se maneja como una instrucción SQL normal, es inmune a la inyección de código SQL.

// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { "MyTitle" };
// Issue SQL statement.
db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);

Actualizar una base de datos

Cuando debas modificar un subconjunto de los valores de la base de datos, usa el método update().

En la actualización de la tabla se combinan la sintaxis del valor de contenido de insert() y la sintaxis where de delete().

SQLiteDatabase db = mDbHelper.getReadableDatabase();

// New value for one column
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);

// Which row to update, based on the title
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
String[] selectionArgs = { "MyTitle" };

int count = db.update(
    FeedReaderDbHelper.FeedEntry.TABLE_NAME,
    values,
    selection,
    selectionArgs);
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)