Ir al contenido principal

BDate Parte 4 - Creando la base de datos

Ya trabajamos los layout y algunas clases de esta aplicación, en donde creábamos un archivo de texto y lo manejábamos mediante flujos (Stream), pero solo nos servia para crear y abrir un solo archivo (se podía mejorar eso, pero lo haremos mas eficiente aun). En esta ocasión haremos uso de una base de datos para guardar y recuperar información y de esta manera tener N cantidad de notas, así que manos a la obra.

Lo primero sera hacernos de una clase auxiliar y adaptarla a nuestras necesidades para que el manejo de los datos sea simple. Esta clase sera llamada BDAdapter.java


El código fuente de esta clase es el siguiente:
package com.nayosx.nl;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
 public static final String KEY_ROWID = "_id";
 public static final String KEY_TITULO = "titulo";
 public static final String KEY_NOTA = "nota";
 
 
 public static final String DATABASE_NAME = "DB_Notas_BDate";
 public static final String DATABASE_TABLE = "BDate";
 public static final int DATABASE_VERSION = 1;
 public static final String TAG = "DBAdapter";
 
 
 public static final String DATABASE_CREATE = "create table "+DATABASE_TABLE+"("+KEY_ROWID+" integer primary key autoincrement not null, "+
             KEY_TITULO+" text not null, "+KEY_NOTA+" text not null);"; 
 
 private final Context context;
 private DatabaseHelper DBHelper;
 
 private SQLiteDatabase db;
 
 public DBAdapter(Context ctx)
 {
  this.context = ctx;
  DBHelper = new DatabaseHelper(context);
 }
 
 
 public static class DatabaseHelper extends SQLiteOpenHelper{

  public DatabaseHelper(Context context) {
   super(context, DATABASE_NAME, null, DATABASE_VERSION);
   // TODO Auto-generated constructor stub
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   // TODO Auto-generated method stub
   try{
    db.execSQL(DATABASE_CREATE);
   }
   catch(SQLException e)
   {
    e.printStackTrace();
   }
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   Log.w(DBAdapter.TAG, "se ha actualizado la base de datos");
   db.execSQL("DROP TABLE IF EXIST"+DBAdapter.DATABASE_TABLE);
   onCreate(db);
  }

 }
 
 
 public DBAdapter abrir() throws SQLException
 {
  db = DBHelper.getWritableDatabase(); 
  return this;
  
 }
 public void cerrar()
 {
  DBHelper.close();
 }
 
 public long insertarNotas(String titu, String nota)
 {
  ContentValues initVal = new ContentValues();
  initVal.put(KEY_TITULO, titu);
  initVal.put(KEY_NOTA, nota);
  return db.insert(DATABASE_TABLE, null, initVal);
 }
 
 public Cursor getAllNotas()
 {
  String [] getMain = {KEY_ROWID,
       KEY_TITULO,
       KEY_NOTA
       };
  return db.query(DATABASE_TABLE, getMain, null, null, null, null, null);
 }
}


A continuación la explicación del código de esta clase:

Las constantes estáticas


 public static final String KEY_ROWID = "_id";
 public static final String KEY_TITULO = "titulo";
 public static final String KEY_NOTA = "nota";
 
 
 public static final String DATABASE_NAME = "DB_Notas_BDate";
 public static final String DATABASE_TABLE = "BDate";
 public static final int DATABASE_VERSION = 1;
 public static final String TAG = "DBAdapter";
 
 
 public static final String DATABASE_CREATE = "create table "+DATABASE_TABLE+"("+KEY_ROWID+" integer primary key autoincrement not null, "+
             KEY_TITULO+" text not null, "+KEY_NOTA+" text not null);"; 
 
 

Sirven para crear toda la base de datos, son muy simples de entender ya que ellas solas se explican, quizás la mas difícil de comprender sea la DATABASE_CREATE, pero simplemente se trata de una sentencia SQL en donde le indicamos la tabla que queremos crear, así como todos sus campos y la llave primaria de dicha tabla.



las demás variables y el constructor de la clase DBAdapter

 
 private final Context context;
 private DatabaseHelper DBHelper;
 
 private SQLiteDatabase db;
 
 public DBAdapter(Context ctx)
 {
  this.context = ctx;
  DBHelper = new DatabaseHelper(context);
 }
 

Bueno si han leido un poco la documentacion de Android sobre SQLiteOpenHelper, sabran que se necesita de un contexto (en este caso simplemente llamado context)en el cual actuar, por esta razón nuestro adaptador crea una variable que sera utilizada dentro del constructor de nuestra clase BDAdapter .

Ademas necesitamos crear una clase (llamada SQLiteDatabase y como instancia db) dentro de nuestra clase BDAdapter (no es necesario hacerlo así, pero para ahorrar tiempo y espacio lo deje de esa manera).
Dentro del constructor de nuestra clase BDAdapter, inicializamos el contexto y luego se lo asignamos al constructor de SQLiteDatabase (Esto para mandarselo a la clase padre de SQLiteDatabase, es decir para mandárselo al constructor de la clase SQLiteOpenHelper).

Se que suena confuso, pero esa es la forma adecuada de actuar con la clases SQLiteOpenHelper.


La clase SQLiteDatabase 

 public static class DatabaseHelper extends SQLiteOpenHelper{

  public DatabaseHelper(Context context) {
   super(context, DATABASE_NAME, null, DATABASE_VERSION);
   // TODO Auto-generated constructor stub
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   // TODO Auto-generated method stub
   try{
    db.execSQL(DATABASE_CREATE);
   }
   catch(SQLException e)
   {
    e.printStackTrace();
   }
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   Log.w(DBAdapter.TAG, "se ha actualizado la base de datos");
   db.execSQL("DROP TABLE IF EXIST"+DBAdapter.DATABASE_TABLE);
   onCreate(db);
  }

 }

Esta clase es la que realmente crea la base de datos, esta interna a nuestra clase DBAdapter, quizás muchos de ustedes ya hayan trabajado con ella. Su creación es simple, se comienza heredando de SQLiteOpenHelper la cual nos pedirá que creemos un constructor para comenzar a trabajarla, luego sobre escribimos los métodos onCreate() y onUpgrade(), los cuales nos permitirán crear y mejorar la base de datos.

El constructor simplemente inicializa el nombre de la base de datos así como su versión.
onCreate() se encarga de terminar el trabajo con el método execSQL() y como parámetro nuestra constante estática  DATABASE_CREATE, no confundir el parámetro db (que hace uso del metodo execSQL() ), con la instancia db, ambas son ajenas y la diferencia entre ambas es grande.

onUpgrade() se encarga de hacer los ajustes a la base de datos, en caso de que creemos un nuevo campo en algunas de las tablas, o que creemos alguna tabla extra, recordemos que solo tenemos una tabla y que no necesitaremos hacer eso, pero es recomendable dejarlo de esa manera.


Los métodos de ayuda de DBAdapter


 
 public DBAdapter abrir() throws SQLException
 {
  db = DBHelper.getWritableDatabase(); 
  return this;
  
 }
 public void cerrar()
 {
  DBHelper.close();
 }
 
 public long insertarNotas(String titu, String nota)
 {
  ContentValues initVal = new ContentValues();
  initVal.put(KEY_TITULO, titu);
  initVal.put(KEY_NOTA, nota);
  return db.insert(DATABASE_TABLE, null, initVal);
 }
 
 public Cursor getAllNotas()
 {
  String [] getMain = {KEY_ROWID,
       KEY_TITULO,
       KEY_NOTA
       };
  return db.query(DATABASE_TABLE, getMain, null, null, null, null, null);
 }


Creo que estos metodos no necesitaran mucha explicación, ya que casi todos estan en español

abrir() retorna Una instancia DBAdapter y simplemente le asigna a db el valor (o como querramos llamarlo) del método estático getWritableDatabase(), es decir le indica que queremos abrir nuestra base de datos.

cerrar() no creo que necesite explicación alguna.

insertarNotas() solamente esta esperando a que le mandemos valores, luego se encarga de insertarlos en la base de datos. Hace uso de ContentValue para luego mandarle todo el contenido al método insert().

getAllNotas() nos ayuda a obtener todos los valores de la base de datos, haciendo uso del método query()

Bueno hasta aquí lo que es referente a la base de datos, mas adelante le agregaremos otros métodos para eliminar, actualizar el contenido de ella (e implícitamente la de las notas).

La siguiente parte del tutorial tratara sobre el ListView con el que mostraremos las notas (recuperando todo el contenido de nuestra base de datos), así que pendientes

Entradas populares de este blog

Northwind para Mysql y otras

Supongamos que necesitamos una base de datos para comenzar a hacer pruebas y a la vez necesitamos que esa base de datos contenga mucha información con la cual trabajar. En mis tiempos de universidad existía una base de datos que utilizábamos en los laboratorios con SQL Server y c# para mostrar los datos en algún formulario. El nombre era Northwind. El problema es que era solo para SQL Server, pero alguien en se dio a la tarea de exportar esa base de datos a MySql y es justo lo que te vengo a mostrar acá. Hace un tiempo atrás clone de los repositorios de Google Code   esa información (que como algunos de ustedes sabrá dejara de estar al servicio de todos en un tiempo). Modifique un poco la DB de Mysql para que se pudiera ejecutar el script sin ningún problema. Lo interesante de todo esto es que puedes utilizar los demás script para diferentes gestores de base de datos Se advierte que para poder usarlas adecuadamente hay que modificar los campos de tipo longblob y que hay un

How to upload File from form data POST in Android with Retrofit 2

 The last day I explain how to upload a simple CSV file using node . And now I teach how to upload from android device. Get source code here:  GitHub This article is write in java... later I'll add the method for kotlin. The logic is not changed, only the format code. 1) Is necessary add the dependencies in gradle: module implementation 'com.google.code.gson:gson:2.8.6' // RETROFIT // implementation 'com.squareup.retrofit2:retrofit:2.6.2' implementation 'com.squareup.retrofit2:converter-gson:2.6.2' implementation 'com.squareup.retrofit2:converter-scalars:2.5.0' 2) Add permissions in AndroidManifest.xml and modified the application for work with network security policy <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> in applitacion add

Abrir modal cuando se cargue la pagina web

Se advierte que blogger puede cambiar el resultado, pero tranquilo, te dejo un enlace donde lo puedes ver sin mas ni mas haciendo click aquí Una de las cosas interesantes de  usar Bootstrap en tus proyectos es que ya trae muchas funcionalidades como los modales. Algo en particular que me han preguntado mas de una vez es lo siguiente: ¿Puedo abrir un modal al momento de cargar una pagina web? La respuesta es un simple SI y te muestro como hacerlo de manera rápida Ahora simplemente tenemos que mandar a llamar un fragmento de código en nuestro JQuery: $(function(){ $("#myModal").modal(); }); Es algo simple cuando ya conoces la solución claro y espero te sirva mucho