Tutorial de SQLite Con Ejemplo En Android Studio | Tutorial De Base De Datos En Android Studio: Almacena tus datos

Tutorial de SQLite con ejemplo en Android Studio

SQLite es una base de datos de consulta de estructura, de código abierto, de peso ligero, sin acceso a la red y base de datos independiente. Soporta características de base de datos relacionales embebidas.

Operaciones de la base de datos SQLite

Operaciones de la base de datos SQLite

Cuando una aplicación necesita almacenar gran cantidad de datos entonces usar sqlite es más preferible que otro sistema de repositorio como SharedPreferences o guardar datos en archivos.

Android ha incorporado la implementación de la base de datos SQLite. Está disponible localmente en el dispositivo (móvil & tablet) y contiene datos en formato de texto. Lleva datos de peso ligero y adecuado con muchos idiomas. Por lo tanto, no requiere ningún procedimiento de administración o configuración de la base de datos.

Nota importante – La base de datos creada se guarda en un directorio: data/data/APP_Name/databases/DATABASE_NAME.

Creación y actualización de la base de datos en Android

Para crear, actualizar y otras operaciones es necesario crear una subclase o clase SQLiteOpenHelper. SQLiteOpenHelper es una clase de ayuda para gestionar la creación de bases de datos y la gestión de versiones. Proporciona dos métodos onCreate(SQLiteDatabase db), onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion).

El SQLiteOpenHelper se encarga de abrir la base de datos si existe, de crearla si no existe y de actualizarla si es necesario. El SQLiteOpenHelper sólo requiere el DATABASE_NAME para crear la base de datos. Después de extender SQLiteOpenHelper necesitarás implementar sus métodos onCreate, onUpgrade y constructor.

El método onCreate(SQLiteDatabase sqLiteDatabase) se llama sólo una vez a lo largo del ciclo de vida de la aplicación. Se llamará siempre que haya una primera llamada a la función getReadableDatabase() o getWritableDatabase() disponible en la clase super SQLiteOpenHelper. Así que la clase SQLiteOpenHelper llama al método onCreate() después de crear la base de datos e instanciar el objeto SQLiteDatabase. El nombre de la base de datos se pasa en la llamada al constructor.

onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) sólo se llama cuando hay una actualización en la versión existente. Así que para actualizar una versión tenemos que incrementar el valor de la variable version pasada en el constructor de la superclase.

En el método onUpgrade podemos escribir consultas para realizar cualquier acción que se requiera. En la mayoría de los ejemplos verás que se eliminan las tablas existentes y de nuevo se llama al método onCreate() para crear tablas de nuevo. Pero no es obligatorio hacerlo y todo depende de sus requisitos.

Tenemos que cambiar la versión de la base de datos si hemos añadido una nueva fila en la tabla de la base de datos. Si tenemos el requisito de que no queremos perder los datos existentes en la tabla, entonces podemos escribir la consulta alter table en el método onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion).

Para más detalles leer: Insert, Read, Delete & Operación de actualización en SQLite

Ejemplo de SQLite en Android Studio

Entérate mejor de Sqlite antes de leer el ejemplo – Para entender mejor la base de datos SQlite, se recomienda leer primero el siguiente artículo:

  • Introducción a SQLite e instalación
  • Lista de todos los operadores en SQLite
  • Tipo de datos y comandos en SQLite
  • Lista de todas las cláusulas en SQLite para definir una condición específica
  • Insertar, Read, Delete & Update Operation In SQLite

En este ejemplo simplemente queremos ilustrar las operaciones de inserción, actualización, borrado y más de SQLite sobre una tabla en Android Studi. Creamos una actividad que tiene textview, botón y edittext sobre ella. Otra clase que extiende SQLiteOpenHelper donde se realizarán las operaciones de creación e inserción. El ejemplo contiene una validación adecuada como es la de introducir los datos antes de ejecutar cualquier operación.

Abajo puedes descargar el código, ver la salida final y la explicación paso a paso:

Descargar código

Operación de inserción de SQLite en Android Studio

Operación de inserción de SQLite en Android Studio

Paso 1: Crear un nuevo proyecto y nombrarlo SQLiteOperations.

Paso 2: Abrir res -> layout -> activity_main.xml (o) main.xml y añadir el siguiente código:

En este paso creamos un layout en nuestro archivo XML añadiendo textbox, botones, edittext. En el botón onclick se define que asociarlo con la función relacionada.

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.sqliteoperations.MainActivity" android:background="@android:color/holo_blue_dark"> <TextView android:text="@string/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="12dp" android:id="@+id/textView" android:textSize="18sp" android:textStyle="bold|italic" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:gravity="center" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editName" android:textStyle="bold|italic" android:layout_below="@+id/textView" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:hint="Enter Name" android:gravity="center_vertical|center" /> <TextView android:text="@string/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="13dp" android:id="@+id/textView2" android:textStyle="bold|italic" android:textSize="18sp" android:layout_below="@+id/editName" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:gravity="center" android:hint="Enter Password" /> <Button android:text="@string/view_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:textSize="18sp" android:onClick="viewdata" android:textStyle="bold|italic" android:layout_alignBaseline="@+id/button" android:layout_alignBottom="@+id/button" android:layout_alignRight="@+id/button4" android:layout_alignEnd="@+id/button4" /> <Button android:text="@string/add_user" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" android:textStyle="bold|italic" android:textSize="18sp" android:onClick="addUser" android:layout_marginLeft="28dp" android:layout_marginStart="28dp" android:layout_below="@+id/editPass" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="23dp" /> <Button android:text="@string/update" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3" android:onClick="update" android:textStyle="normal|bold" android:layout_below="@+id/editText3" android:layout_alignLeft="@+id/button4" android:layout_alignStart="@+id/button4" android:layout_marginTop="13dp" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editText6" android:layout_alignTop="@+id/button4" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:freezesText="false" android:hint="Enter Name to Delete Data" android:layout_toLeftOf="@+id/button2" android:layout_toStartOf="@+id/button2" /> <Button android:text="@string/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="21dp" android:layout_marginEnd="21dp" android:id="@+id/button4" android:onClick="delete" android:textStyle="normal|bold" tools:ignore="RelativeOverlap" android:layout_marginBottom="41dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:layout_marginTop="47dp" android:id="@+id/editText3" android:textStyle="bold|italic" android:textSize="14sp" android:layout_below="@+id/button" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="7dp" android:layout_marginStart="7dp" android:hint="Current Name" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:ems="10" android:layout_marginTop="11dp" android:id="@+id/editPass" android:hint="Enter Password" android:gravity="center_vertical|center" android:textSize="18sp" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textAllCaps="false" android:textStyle="normal|bold" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editText5" android:textStyle="bold|italic" android:textSize="14sp" android:hint="New Name" android:layout_alignTop="@+id/button3" android:layout_alignLeft="@+id/editText3" android:layout_alignStart="@+id/editText3" android:layout_marginTop="32dp" /></RelativeLayout>

Paso 3 : Ahora abra la aplicación -> java -> paquete ->

En este paso utilizamos las funciones que enlazan a través del clic del botón. Estas funciones están definidas en otra clase y se utilizan aquí. Cada función devuelve un valor que define el número de filas actualizadas, usando esto definimos si la operación es exitosa o no. También el usuario necesita definir datos válidos para realizar la operación, los campos vacíos no serán aceptados y devolverán un error.

package com.example.sqliteoperations;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity { EditText Name, Pass , updateold, updatenew, delete; myDbAdapter helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Name= (EditText) findViewById(R.id.editName); Pass= (EditText) findViewById(R.id.editPass); updateold= (EditText) findViewById(R.id.editText3); updatenew= (EditText) findViewById(R.id.editText5); delete = (EditText) findViewById(R.id.editText6); helper = new myDbAdapter(this); } public void addUser(View view) { String t1 = Name.getText().toString(); String t2 = Pass.getText().toString(); if(t1.isEmpty() || t2.isEmpty()) { Message.message(getApplicationContext(),"Enter Both Name and Password"); } else { long id = helper.insertData(t1,t2); if(id<=0) { Message.message(getApplicationContext(),"Insertion Unsuccessful"); Name.setText(""); Pass.setText(""); } else { Message.message(getApplicationContext(),"Insertion Successful"); Name.setText(""); Pass.setText(""); } } } public void viewdata(View view) { String data = helper.getData(); Message.message(this,data); } public void update( View view) { String u1 = updateold.getText().toString(); String u2 = updatenew.getText().toString(); if(u1.isEmpty() || u2.isEmpty()) { Message.message(getApplicationContext(),"Enter Data"); } else { int a= helper.updateName( u1, u2); if(a<=0) { Message.message(getApplicationContext(),"Unsuccessful"); updateold.setText(""); updatenew.setText(""); } else { Message.message(getApplicationContext(),"Updated"); updateold.setText(""); updatenew.setText(""); } } } public void delete( View view) { String uname = delete.getText().toString(); if(uname.isEmpty()) { Message.message(getApplicationContext(),"Enter Data"); } else{ int a= helper.delete(uname); if(a<=0) { Message.message(getApplicationContext(),"Unsuccessful"); delete.setText(""); } else { Message.message(this, "DELETED"); delete.setText(""); } } }}

Paso 4: En este paso creamos una clase java myDbAdapter. java.

En ella definimos las funciones que se utilizan para realizar las operaciones de inserción, actualización y eliminación en SQLite. Además esta clase crea otra clase que extenderá el SQLiteOpenHelper. Cada función lleva métodos equivalentes que realizan las operaciones.

Nota importante – Según la convención de nomenclatura se sugiere definir la clave primaria empezando por el guión bajo ejemplo: _id.

package com.example.sqliteoperations;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class myDbAdapter { myDbHelper myhelper; public myDbAdapter(Context context) { myhelper = new myDbHelper(context); } public long insertData(String name, String pass) { SQLiteDatabase dbb = myhelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(myDbHelper.NAME, name); contentValues.put(myDbHelper.MyPASSWORD, pass); long id = dbb.insert(myDbHelper.TABLE_NAME, null , contentValues); return id; } public String getData() { SQLiteDatabase db = myhelper.getWritableDatabase(); String columns = {myDbHelper.UID,myDbHelper.NAME,myDbHelper.MyPASSWORD}; Cursor cursor =db.query(myDbHelper.TABLE_NAME,columns,null,null,null,null,null); StringBuffer buffer= new StringBuffer(); while (cursor.moveToNext()) { int cid =cursor.getInt(cursor.getColumnIndex(myDbHelper.UID)); String name =cursor.getString(cursor.getColumnIndex(myDbHelper.NAME)); String password =cursor.getString(cursor.getColumnIndex(myDbHelper.MyPASSWORD)); buffer.append(cid+ " " + name + " " + password +" \n"); } return buffer.toString(); } public int delete(String uname) { SQLiteDatabase db = myhelper.getWritableDatabase(); String whereArgs ={uname}; int count =db.delete(myDbHelper.TABLE_NAME ,myDbHelper.NAME+" = ?",whereArgs); return count; } public int updateName(String oldName , String newName) { SQLiteDatabase db = myhelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(myDbHelper.NAME,newName); String whereArgs= {oldName}; int count =db.update(myDbHelper.TABLE_NAME,contentValues, myDbHelper.NAME+" = ?",whereArgs ); return count; } static class myDbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "myDatabase"; // Database Name private static final String TABLE_NAME = "myTable"; // Table Name private static final int DATABASE_Version = 1;. // Database Version private static final String UID="_id"; // Column I (Primary Key) private static final String NAME = "Name"; //Column II private static final String MyPASSWORD= "Password"; // Column III private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+ " ("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255) ,"+ MyPASSWORD+" VARCHAR(225));"; private static final String DROP_TABLE ="DROP TABLE IF EXISTS "+TABLE_NAME; private Context context; public myDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_Version); this.context=context; } public void onCreate(SQLiteDatabase db) { try { db.execSQL(CREATE_TABLE); } catch (Exception e) { Message.message(context,""+e); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { Message.message(context,"OnUpgrade"); db.execSQL(DROP_TABLE); onCreate(db); }catch (Exception e) { Message.message(context,""+e); } } }}

Paso 5: En este paso se crea otra clase java Message.class

En esta simplemente se añade el toast para mostrar el mensaje. Esto es opcional, simplemente se añade una y otra vez definiendo toast en el ejemplo.

package com.example.sqliteoperations;import android.content.Context;import android.widget.Toast;public class Message { public static void message(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); }}

Salida
Ahora ejecuta la app y ve la funcionalidad añadida sobre los botones.
Operación de actualización y borrado de SQLite en Android Studio

Operación de actualización y borrado de SQLite en Android Studio

Add & Recuperar imagen de la base de datos SQLite:

Para entender cómo agregar o recuperar la imagen desde el almacenamiento externo del teléfono a la aplicación utilizando la base de datos SQLite. Por favor, lea nuestro paso a paso añadir & recuperar imagen de SQLite tutorial.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *