martes, 28 de abril de 2015

Android - Usar una base de datos existente

Es normal que para nuestras aplicaciones queramos trabajar con una base de datos previamente creada con datos insertados. Los pasos a seguir serán los siguientes:
  1. Crear la base de datos SQLite e insertar los datos que queramos. Podeís usar para ello alguna herramienta como SQLite Studio.
  2. Copiamos la base de datos creada a la carpeta de nuestro proyecto Android assets.
  3. Ahora en la clase que vamos a usar para interactuar con la base de datos lo que se va a hacer es lo siguiente:
    1. Verificar si ya existe la base de datos. Si esto ociurre ya ha sido creada por lo que no será necesario crearla de nuevo. En este caso debemos tener en cuenta que la ruta a la base de datos de nuestra aplicación viene dada por "context.getApplicationInfo().dataDir + "/databases/" + DATABASE_NAME" tal y como podeís ver en el código de ejemplo.
    2. Si no existe simplemente copiaremos el archivo que previamente hemos colocado en la carpeta assets en la ruta vista con anterioridad.
A continuación tenéis el código de ejemplo:


package com.losga.pedidos.com.losga.db;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.res.AssetManager;
import android.util.Log;

import com.losga.pedidos.dto.Entity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;

/**
 * Created by Luis J. L.G. 
 */
public class DBHelper extends SQLiteOpenHelper {

    private Context context;
 
    // Nombre de la base de datos
    private static final String DATABASE_NAME = "ljlg.db";
 
    // Ruta donde se encuntra la base de datos
    private static String path;

    private static final int DATABASE_VERSION = 1;

    public DBHelper(Context context)
    {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
         try {
             this.context = context;
             // Ruta donde va a estar la base de datos en Android
             path = context.getApplicationInfo().dataDir + "/databases/" + DATABASE_NAME;
             copyDB();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    private void copyDB() throws IOException {

        // Verificar si ya existe la base de datos
        File dbArchivo = new File(path);
        if (!dbFile.exists()) {
            InputStream inputStream = context.getAssets().open("MiDB.db");
            // Se crea el archivo para la base de datos
            OutputStream outputStream = new FileOutputStream(path);
            byte[] buffer = new byte[4096];
            int length;
            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }
            outputStream.flush();
            outputStream.close();
            inputStream.close();
        }
    }
}