En este tutorial, aprenderá cómo crear una base de datos SQLite que le permita almacenar datos en la memoria interna de su dispositivo. Los dispositivos Android vienen con una base de datos SQLite integrada que tiene métodos para crear, actualizar, eliminar, ejecutar comandos SQL y realizar otras tareas comunes de administración de bases de datos. Crearemos una aplicación sencilla que permita a los usuarios crear, actualizar, eliminar y mostrar una lista de datos. Vamos a empezar…
Cree un nuevo proyecto en Eclipse File > New > Android Application Project. Complete los detalles y nombre su proyecto DatabaseTutorial .
Nombre de la aplicación: Tutorial de base de datos
Nombre del proyecto: Tutorial de base de datos
Nombre del paquete: com.androidbegin.databasetutorial
Abra su MainActivity .java y pegue el siguiente código.
Actividad principal .java
paquete com.androidbegin.databasetutorial; importar android.os.AsyncTask; importar android.os.Bundle; importar android.app.ListActivity; importar android.content.Intent; importar android.database.Cursor; importar android.view.Menú; importar android.view.MenuItem; importar android.view.View; importar android.view.MenuItem.OnMenuItemClickListener; importar android.widget.AdapterView; importar android.widget.CursorAdapter; importar android.widget.ListView; importar android.widget.SimpleCursorAdapter; importar android.widget.AdapterView.OnItemClickListener; clase pública MainActivity extiende ListActivity { // Declarar Variables Cadena final estática pública ROW_ID = "row_id"; Cadena final estática privada TITLE = "título"; ListView privado noteListView; adaptador de nota de CursorAdapter privado; @Anular public void onCreate (Paquete guardadoInstanceState) { super.onCreate(estadoDeInstanciaGuardado); // Localizar ListView noteListView = getListView(); // Preparar elemento ListView Click Listener noteListView.setOnItemClickListener(viewNoteListener); // Asigne todos los títulos a ViewTitleNotes TextView Cadena[] de = nueva Cadena[] { TÍTULO }; int[] to = new int[] { R.id.ViewTitleNotes }; // Crear un adaptador de cursor simple noteAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.list_note, null, from, to); // Establecer el adaptador en SimpleCursorAdapter setListAdapter(noteAdapter); } // Capturar clic en el elemento ListView OnItemClickListener viewNoteListener = new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, Ver arg1, int arg2, argumento largo3) { // Abrir la actividad ViewNote Intent viewnote = new Intent(MainActivity.this, ViewNote.class); // Pasar el ROW_ID a la actividad ViewNote viewnote.putExtra(ROW_ID, arg3); iniciarActividad(vernota); } }; @Anular vacío protegido en el currículum () { super.onReanudar(); // Ejecutar GetNotes Asynctask al regresar a MainActivity nuevo GetNotes().ejecutar((Objeto[]) nulo); } @Anular vacío protegido onStop() { Cursor cursor = noteAdapter.getCursor(); // Desactiva el Cursor si (cursor != nulo) cursor.desactivar(); noteAdapter.cambiarCursor(nulo); super.onStop(); } // Crear un menú de barra de acción @Anular public boolean onCreateOptionsMenu(Menú menú) { // Título del menú menu.add("Agregar nuevas notas") .setOnMenuItemClickListener(this.SaveButtonClickListener) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); volver super.onCreateOptionsMenu(menú); } // Hacer clic en el elemento del menú de captura OnMenuItemClickListener SaveButtonClickListener = nuevo OnMenuItemClickListener() { onMenuItemClick público booleano (elemento MenuItem) { // Abrir la actividad AddEditNotes Intent addnote = new Intent(MainActivity.this, AddEditNotes.class); iniciarActividad(añadirnota); falso retorno; } }; // GetNotesAsyncTask clase privada GetNotes extiende AsyncTask<Objeto, Objeto, Cursor> { DatabaseConnector dbConnector = new DatabaseConnector(MainActivity.this); @Anular Cursor protegido doInBackground(Object... params) { // Abrimos la base de datos ConectorBD.open(); volver dbConnector.ListAllNotes(); } @Anular vacío protegido en PostExecute (resultado del cursor) { noteAdapter.changeCursor(resultado); // Cerrar base de datos ConectorBD.close(); } } }
En esta actividad, mostraremos la lista de elementos en una vista de lista desde la base de datos SQLite mediante el uso de AsyncTask para llamar a la función ListAllNotes desde la clase Conector de base de datos. En el elemento de vista de lista, haga clic en pasar la identificación de la fila a la clase ViewNote. Luego, hemos creado un menú de opciones para abrir la clase AddEditNotes que permite a los usuarios agregar elementos a la vista de lista.
A continuación, cree un diseño gráfico XML para su MainActivity. Vaya a res > diseño > Haga clic con el botón derecho en el diseño > Nuevo > Archivo XML de Android
Nombre su nuevo archivo XML list_note.xml y pegue el siguiente código.
lista_nota .xml
<?versión xml="1.0" codificación="utf-8"?> <RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android" android_layout_width="fill_parent" android_layout_height="wrap_content" android_relleno="20dip" > <Vista de texto android_id="@+id/VerNotasDeTítulo" android_layout_width="wrap_content" android_layout_height="wrap_content" android_layout_centerVertical="verdadero" android_textStyle="negrita" /> </RelativeLayout>
Producción:
A continuación, cree las funciones de la base de datos en una nueva clase llamada DatabaseConnector .java . Vaya a Archivo > Nuevo > Clase y asígnele el nombre DatabaseConnector.java. Seleccione su paquete llamado com.androidbegin.databasetutorial y haga clic en Finalizar .
Abra su DatabaseConnector .java y pegue los siguientes códigos.
Conector de base de datos .java
paquete com.androidbegin.databasetutorial; importar android.content.ContentValues; importar android.content.Context; importar android.database.Cursor; importar android.database.SQLException; importar android.database.sqlite.SQLiteDatabase; Conector de base de datos de clase pública { // Declarar Variables Cadena final estática privada DB_NAME = "MyNotes"; Cadena final estática privada TABLE_NAME = "tablenotes"; Cadena final estática privada TITLE = "título"; ID de cadena final estática privada = "_id"; Cadena final estática privada NOTA = "nota"; privado estático final int DATABASE_VERSION = 1; base de datos SQLiteDatabase privada; ayudante de base de datos privada dbOpenHelper; Conector de base de datos público (contexto contextual) { dbOpenHelper = new DatabaseHelper(contexto, DB_NAME, nulo, VERSIÓN_BASE DE DATOS); } // Abrir función de base de datos public void open() lanza SQLException { // Permitir que la base de datos esté en modo de escritura base de datos = dbOpenHelper.getWritableDatabase(); } // Cerrar función de base de datos cierre de vacío público () { si (base de datos! = nulo) base de datos.cerrar(); } // Crear función de base de datos public void InsertNote(Título de cadena, Nota de cadena) { ContentValues newCon = nuevos ContentValues(); newCon.put(TÍTULO, título); newCon.put(NOTA, nota); abierto(); base de datos.insertar(TABLE_NAME, null, newCon); cerca(); } // Actualizar función de base de datos Public void UpdateNote (ID largo, título de cadena, nota de cadena) { ContentValues editCon = new ContentValues(); editCon.put(TÍTULO, título); editCon.put(NOTA, nota); abierto(); base de datos.update(TABLE_NAME, editCon, ID + "=" + id, nulo); cerca(); } // Eliminar función de base de datos public void DeleteNote (identificación larga) { abierto(); base de datos.borrar(NOMBRE_TABLA, ID + "=" + id, nulo); cerca(); } // Listar todas las funciones de datos Cursor público ListAllNotes() { return base de datos.consulta(NOMBRE_TABLA, nueva Cadena[] { ID, TÍTULO }, nulo, nulo, nulo, nulo, TÍTULO); } // Captura datos individuales por ID Cursor público GetOneNote (identificación larga) { volver base de datos.consulta(TABLE_NAME, null, ID + "=" + id, null, null, nulo, nulo); } }
En esta clase, tenemos algunas funciones básicas de bases de datos, como crear, actualizar, eliminar y listar datos. Todas las funciones de la clase DatabaseConnector se pueden llamar desde otras clases.
NOTA: Para restablecer o borrar la base de datos, simplemente cambie el número de versión.
privado estático final int DATABASE_VERSION = 1;
A continuación, cree un asistente de base de datos SQLite para ayudar a administrar la creación de bases de datos y la administración de versiones. Vaya a Archivo > Nuevo > Clase y asígnele el nombre DatabaseHelper.java. Seleccione su paquete llamado com.androidbegin.databasetutorial y haga clic en Finalizar .
Abra su DatabaseHelper .java y pegue los siguientes códigos.
Ayudante de base de datos .java
paquete com.androidbegin.databasetutorial; importar android.content.Context; importar android.database.sqlite.SQLiteDatabase; importar android.database.sqlite.SQLiteDatabase.CursorFactory; importar android.database.sqlite.SQLiteOpenHelper; clase pública DatabaseHelper extiende SQLiteOpenHelper { // Declarar Variables Cadena final estática privada DB_NAME = "MyNotes"; public static final String TABLE_NAME = "tablenotes"; public static final String TITLE = "título"; public static final String NOTA = "nota"; DatabaseHelper público (contexto de contexto, nombre de cadena, fábrica de CursorFactory, versión int) { super(contexto, DB_NAME, fábrica, versión); } @Anular vacío público en Crear (SQLiteDatabase db) { // Crear una tabla de base de datos Cadena createQuery = "CREAR TABLA" + TABLE_NAME + " (autoincremento de clave principal de número entero _id," + TÍTULO + ", " + NOTA + ");"; db.execSQL(createQuery); } @Anular public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // La base de datos se borrará con el cambio de versión db.execSQL("BOTAR TABLA SI EXISTE" + NOMBRE_TABLA); onCreate(db); } }
Hemos creado un ayudante de base de datos utilizando una consulta SQLite simple. Hemos establecido el número entero » id » como CLAVE PRINCIPAL y se utiliza para identificar de forma única cada registro en una tabla de base de datos. La base de datos se borrará o eliminará automáticamente si se realizan cambios en el número de versión como se mencionó anteriormente.
A continuación, cree una actividad para el elemento ListView, haga clic en que muestre los datos de una sola base de datos. Vaya a Archivo > Nuevo > Clase y asígnele el nombre ViewNote.java. Seleccione su paquete llamado com.androidbegin.databasetutorial y haga clic en Finalizar .
Abra su ViewNote.java y pegue el siguiente código.
VerNota.java
paquete com.androidbegin.databasetutorial; importar android.app.Actividad; importar android.app.AlertDialog; importar android.content.DialogInterface; importar android.content.Intent; importar android.database.Cursor; importar android.os.AsyncTask; importar android.os.Bundle; importar android.view.Menú; importar android.view.MenuItem; importar android.view.MenuItem.OnMenuItemClickListener; importar android.widget.TextView; la clase pública ViewNote extiende la actividad { // Declarar Variables ID de fila largo privado; TextView privado TitleTv; TextView NoteTv privado; Cadena final estática privada TITLE = "título"; Cadena final estática privada NOTA = "nota"; @Anular public void onCreate (Paquete guardadoInstanceState) { super.onCreate(estadoDeInstanciaGuardado); setContentView(R.layout.view_note); // Localice TextView en view_note.xml TitleTv = (TextView) findViewById(R.id.TitleText); NoteTv = (TextView) findViewById(R.id.NoteText); // Recuperar el ID de FILA de MainActivity.java Extras del paquete = getIntent().getExtras(); ID de fila = extras.getLong(Actividadprincipal.ROW_ID); } @Anular vacío protegido en el currículum () { super.onReanudar(); // Ejecutar LoadNotes() AsyncTask nuevas LoadNotes().execute(filaID); } // CargarNotas() Tarea Asincrónica clase privada LoadNotes extiende AsyncTask<Long, Object, Cursor> { // Llama a la clase DatabaseConnector.java DatabaseConnector dbConnector = new DatabaseConnector(ViewNote.this); @Anular Cursor protegido doInBackground(Largo... parámetros) { // Pasar el ID de fila a la función GetOneNote en // Clase DatabaseConnector.java ConectorBD.open(); return dbConnector.GetOneNote(parámetros[0]); } @Anular vacío protegido en PostExecute (resultado del cursor) { super.onPostExecute(resultado); resultado.moverAlPrimero(); // Recuperar el índice de columna para cada elemento de datos int TitleIndex = result.getColumnIndex(TITLE); int NoteIndex = resultado.getColumnIndex(NOTA); // Establecer el texto en TextView TitleTv.setText(result.getString(TitleIndex)); NoteTv.setText(resultado.getString(NoteIndex)); resultado.cerrar(); ConectorBD.close(); } } // Crear un menú de opciones @Anular public boolean onCreateOptionsMenu(Menú menú) { menu.add("Editar nota") .setOnMenuItemClickListener(this.EditButtonClickListener) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Eliminar notas") .setOnMenuItemClickListener(this.DeleteButtonClickListener) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); volver super.onCreateOptionsMenu(menú); } // Capturar clic en el elemento del menú de edición OnMenuItemClickListener EditButtonClickListener = nuevo OnMenuItemClickListener() { onMenuItemClick público booleano (elemento MenuItem) { // Pasar ID de fila y datos a AddEditNotes.java Intento addeditnotes = new Intent(ViewNote.this, AddEditNotes.class); addeditnotes.putExtra(MainActivity.ROW_ID, rowID); addeditnotes.putExtra(TITLE, TitleTv.getText()); addeditnotes.putExtra(NOTA, NoteTv.getText()); startActivity(addeditnotes); falso retorno; } }; // Capturar elemento de menú eliminar clic OnMenuItemClickListener DeleteButtonClickListener = nuevo OnMenuItemClickListener() { onMenuItemClick público booleano (elemento MenuItem) { // Llama a la función EliminarNota() Borrar nota(); falso retorno; } }; privado vacío DeleteNote () { // Mostrar un cuadro de diálogo de alerta simple para reconfirmar la eliminación AlertDialog.Builder alerta = new AlertDialog.Builder(ViewNote.this); alert.setTitle("Eliminar elemento"); alert.setMessage("¿Realmente desea eliminar esta nota?"); alert.setPositiveButton("Sí", nueva DialogInterface.OnClickListener() { public void onClick (diálogo de interfaz de diálogo, botón int) { final DatabaseConnector dbConnector = new DatabaseConnector( ViewNote.this); AsyncTask<Largo, Objeto, Objeto> deleteTask = new AsyncTask<Largo, Objeto, Objeto>() { @Anular Objeto protegido doInBackground(Long... params) { // Pasa el ID de fila a la función DeleteNote en // Conector de base de datos.java dbConnector.DeleteNote(parámetros[0]); devolver nulo; } @Anular vacío protegido en PostExecute (resultado del objeto) { // Cerrar esta actividad terminar(); } }; // Ejecute el deleteTask AsyncTask anterior deleteTask.execute(new Long[] {rowID }); } }); // No hacer nada en No hacer clic en el botón alerta.setNegativeButton("No", nulo).show(); } }
En esta actividad, recuperamos el ID de fila del elemento de vista de lista, haga clic en la clase MainActivity y lo mostramos en la clase ViewNote. Luego, usamos el ID de fila como clave principal para actualizar, editar o eliminar los datos mediante las funciones del conector de la base de datos.
A continuación, cree una vista para mostrar los resultados en ViewNote. Vaya a res > diseño > Haga clic con el botón derecho en el diseño > Nuevo > Archivo XML de Android
Nombre su nuevo archivo XML view_note.xml y pegue el siguiente código.
ver_nota .xml
<?versión xml="1.0" codificación="utf-8"?> <RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android" android_layout_width="fill_parent" android_layout_height="fill_parent" android_relleno="5dp" > <Vista de texto android_id="@+id/Tutítulo" android_layout_width="wrap_content" android_layout_height="wrap_content" android_text="@cadena/TuTítulo" android_textStyle="negrita" /> <Vista de texto android_id="@+id/TitleText" android_layout_width="wrap_content" android_layout_height="wrap_content" android_layout_toRightOf="@+id/Tutítulo" Android: relleno inferior = "10dp" android_textStyle="negrita" /> <Vista de texto android_id="@+id/TusNotas" android_layout_width="wrap_content" android_layout_height="wrap_content" android_layout_below="@+id/TitleText" android_text="@cadena/TusNotas" android_textStyle="negrita" /> <Vista de texto android_id="@+id/NotaTexto" android_layout_width="wrap_content" android_layout_height="wrap_content" android_layout_below="@+id/TitleText" android_layout_toRightOf="@+id/TusNotas" android_textStyle="negrita" /> </RelativeLayout>
Producción:
A continuación, cree una nueva actividad para crear y actualizar datos en la base de datos. Vaya a Archivo > Nuevo > Clase y asígnele el nombre AddEditNotes.java. Seleccione su paquete llamado com.androidbegin.databasetutorial y haga clic en Finalizar .
Abra su AddEditNotes .java y pegue el siguiente código.
AñadirEditarNotas .java
paquete com.androidbegin.databasetutorial; importar android.app.Actividad; importar android.app.AlertDialog; importar android.os.AsyncTask; importar android.os.Bundle; importar android.view.Menú; importar android.view.MenuItem; importar android.widget.EditText; importar android.view.MenuItem.OnMenuItemClickListener; la clase pública AddEditNotes extiende la actividad { // Declarar Variables ID de fila largo privado; editText privado title_edit; privado EditText note_edit; Cadena final estática privada TITLE = "título"; Cadena final estática privada NOTA = "nota"; @Anular public void onCreate (Paquete guardadoInstanceState) { super.onCreate(estadoDeInstanciaGuardado); setContentView(R.layout.add_note); // Localiza EditText en add_note.xml title_edit = (EditText) findViewById(R.id.titleEdit); note_edit = (EditText) findViewById(R.id.noteEdit); // Recuperar el ID de fila de ViewNote.java Extras del paquete = getIntent().getExtras(); if (extras!= nulo) { IDfila = extras.getLong("id_fila"); title_edit.setText(extras.getString(TITLE)); note_edit.setText(extras.getString(NOTA)); } } // Crear un menú de barra de acción @Anular public boolean onCreateOptionsMenu(Menú menú) { menu.add("Guardar nota") .setOnMenuItemClickListener(this.SaveButtonClickListener) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); volver super.onCreateOptionsMenu(menú); } // Captura el elemento del menú Guardar clic OnMenuItemClickListener SaveButtonClickListener = nuevo OnMenuItemClickListener() { onMenuItemClick público booleano (elemento MenuItem) { // Pasa los datos a la función saveNote() if (editar_título.getText().longitud() != 0) { AsyncTask<Objeto, Objeto, Objeto> saveNoteAsyncTask = new AsyncTask<Objeto, Objeto, Objeto>() { @Anular Objeto protegido doInBackground(Object... params) { guardarNota(); devolver nulo; } @Anular vacío protegido en PostExecute (resultado del objeto) { // Cerrar esta actividad terminar(); } }; // Ejecutar saveNoteAsyncTask AsyncTask anterior saveNoteAsyncTask.execute((Objeto[]) nulo); } más { // Mostrar un cuadro de diálogo de alerta simple que obliga al usuario a poner un título AlertDialog.Builder alerta = new AlertDialog.Builder( AddEditNotes.this); alert.setTitle("El título es obligatorio"); alert.setMessage("Pon un título para esta nota"); alert.setPositiveButton("Está bien", nulo); alerta.mostrar(); } falso retorno; } }; // función guardarNota() privado void saveNote() { DatabaseConnector dbConnector = new DatabaseConnector(esto); if (getIntent().getExtras() == nulo) { // Pasa los datos a InsertNote en DatabaseConnector.java dbConnector.InsertNote(title_edit.getText().toString(), note_edit .getText().toString()); } más { // Pasa el ID de fila y los datos a UpdateNote en DatabaseConnector.java dbConnector.UpdateNote(rowID, title_edit.getText().toString(), nota_editar.getText().toString()); } } }
En esta actividad, recuperamos el ID de fila y EditTexts de la clase ViewNote. Luego, los usuarios pueden realizar modificaciones en los datos y usar InsertNote() y UpdateNote() para insertar o actualizar los datos en la base de datos.
A continuación, cree un diseño gráfico XML para la clase AddEditNote. Vaya a res > diseño > Haga clic con el botón derecho en el diseño > Nuevo > Archivo XML de Android
Nombre su nuevo archivo XML add_note.xml y pegue el siguiente código.
añadir_nota .xml
<?versión xml="1.0" codificación="utf-8"?> <ScrollView xmlns_android="http://schemas.android.com/apk/res/android" android_layout_width="fill_parent" android_layout_height="wrap_content" Android: diseño_peso = "1" > <LinearLayout android_id="@+id/diseño lineal" android_layout_width="fill_parent" android_layout_height="wrap_content" android: orientación = "vertical" android_relleno="5dp" > <Editar Texto android_id="@+id/títuloEditar" android_layout_width="fill_parent" android_layout_height="wrap_content" android_hint="@string/titleEdit" /> <Editar Texto android_id="@+id/notaEditar" android_layout_width="fill_parent" android_layout_height="wrap_content" android_indicio="@cadena/notaEditar" Android: paddingTop = "20dp" android_inputType="textMultiLine" /> </LinearLayout> </Vista de desplazamiento>
Producción:
A continuación, cambie el nombre y los textos de la aplicación. Abra su strings.xml en su carpeta res > valores y pegue el siguiente código.
cadenas.xml
<recursos> <string name="app_name">Tutorial de base de datos SQLite</string> <string name="hello_world">¡Hola mundo!</string> <string name="menu_settings">Configuración</string> <string name="titleEdit">Título</string> <string name="noteEdit">Notas</string> <string name="TuTítulo">Título: </string> <string name="TusNotas">Notas: </string> </recursos>
En su AndroidManifest.xml , debemos declarar algunas actividades. Abra su AndroidManifest.xml y pegue el siguiente código.
AndroidManifest.xml
<manifiesto xmlns_android="http://schemas.android.com/apk/res/android" paquete="com.androidbegin.databasetutorial" android_versionCode="1" android_versionName="1.0" > <usos-sdk android_minSdkVersion="11" android_targetSdkVersion="15" /> <aplicación android_icono="@dibujable/ic_launcher" android_etiqueta="@cadena/nombre_aplicación" android_tema="@estilo/AppTheme" > <actividad android_nombre=".Actividad principal" android_uiOptions="splitActionBarWhenNarrow" > <intent-filter> <acción android_name="android.intent.action.MAIN" /> <categoría android_name="android.intent.category.LAUNCHER" /> </intent-filter> </actividad> <actividad android_name=".AñadirEditarNotas" android_uiOptions="splitActionBarWhenNarrow" /> <actividad android_name=".DatabaseConnector" /> <actividad android_nombre=".VerNota" android_uiOptions="splitActionBarWhenNarrow" /> </aplicación> </manifiesto>
Producción: