Usar nuestra propia sqlite en Android

De WikiCode

Saltar a navegación, buscar
Delicious

Contenido

Objetivo

Importar en un proyecto android una base de datos sqlite que hayamos creado de forma externa.

Requisitos

Nuestra base de datos tiene que cumplir unos requisitos para que nuestra aplicación android la pueda utilizar.

Tabla android_metadata

La base de datos debe tener una tabla llamada android_metadata que tenga una sola columna "locale" de tipo TEXT. Dicha tabla debe tener al menos un valor, por ejemplo una tupla: locale: en_US

Indices _id

El resto de tablas deben tener como clave primaria un campo llamado _id de tipo int.

Clase DataBaseHelperSqlFromFile.java

Esta clase es la que nos va a permitir crear la base de datos. El código está lo suficientemente comentado para entenderlo. Básicamente al llamar al método createDataBase, comprueba si ya existe en nuestra app y en caso contrario crea una nueva y copia en ella la base de datos que deberemos tener en la carpeta assets.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DataBaseHelperSqlFromFile extends SQLiteOpenHelper{
 
    //La dirección de nuestra aplicación, hay que cambiar la palabra PACKAGE por el nombre del paquete de nuestra app
	//The direction of our application, change the word PACKAGE by the name of our app package
    private final static String DB_PATH = "/data/data/PACKAGE/databases/";
 
    //El nombre del archivo de nuestra base de datos que debemos tener en nuestra carpeta assets
    //The name of our data base file. It must be in our folder assets.
    private final static String DB_NAME = "database.sqlite";
 
    private SQLiteDatabase myDataBase; 
 
    private final Context myContext;
 
    /**
     * Constructor
     */
    public DataBaseHelperSqlFromFile(Context context) {
    	super(context, DB_NAME, null, 1);
        this.myContext = context;
    }	
 
    /**
     * Crea una base de datos vacía y escribe en ella nuesta propia base de datos
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase(Context contexto) throws IOException{
 
    	//Comprueba si ya existe la base de datos
    	boolean dbExist = checkDataBase();
 
 
 
    	if(dbExist){
    		//Si existe la base de datos no hace nada
    		//If our database exists, do nothing
    	}else{
    		//Si no existe se llama a este método que crea una nueva base de datos en la ruta por defecto
    		//If doesnt exists this method creates an empty database into the default system path
        	this.getReadableDatabase();
 
        	try {
        		//Copia nuestra database.sqlite en la nueva base de datos creada
        		//Copy our database.sqlite into the new database
    			copyDataBase();
 
    		} catch (IOException e) {
 
        		throw new Error("Error copying database");
 
        	}
    	}
 
    }
 
    /**
     * Comprueba si ya existe nuestra base de datos
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase(){
 
    	SQLiteDatabase checkDB = null;
 
    	try{
    		String myPath = DB_PATH + DB_NAME;
    		checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
    	}catch(SQLiteException e){
 
    		//database does't exist yet.
 
    	}
 
    	if(checkDB != null){
 
    		checkDB.close();
 
    	}
 
    	return checkDB != null ? true : false;
    }
 
 
    /**
     * Copia nuestra base de datos sqlite de la carpeta assets a nuestra nueva base de datos
     * Copies your database from your local assets-folder to the just created empty database
     * */
    private void copyDataBase() throws IOException{
 
    	//Abre nuestra base de datos del fichero
    	//Open your local db as the input stream
    	InputStream myInput = myContext.getAssets().open(DB_NAME);
 
    	//La dirección de nuestra nueva base de datos
    	// Path to the just created empty db
    	String outFileName = DB_PATH + DB_NAME;
 
    	//Abre la nueva base de datos
    	//Open the empty db as the output stream
    	OutputStream myOutput = new FileOutputStream(outFileName);
 
    	//Transfiere bytes desde nuestro archivo a la nueva base de datos
    	//transfer bytes from the inputfile to the outputfile
    	byte[] buffer = new byte[1024];
    	int length;
    	while ((length = myInput.read(buffer))>0){
    		myOutput.write(buffer, 0, length);
    	}
 
    	//Close the streams
    	myOutput.flush();
    	myOutput.close();
    	myInput.close();
 
    }
 
    /**
     * Abre la base de datos
     * Open the database
     * @throws SQLException
     */
    public void openDataBase() throws SQLException{
 
        String myPath = DB_PATH + DB_NAME;
    	myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
    }
 
    @Override
	public synchronized void close() {
 
    	    if(myDataBase != null)
    		    myDataBase.close();
 
    	    super.close();
 
	}
 
	@Override
	public void onCreate(SQLiteDatabase db) {
 
	}
 
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
	}
}

Modo de uso

Para usarla debemos configurar la clase con en nombre del packete de nuestra app y el nombre de la base de datos que hayamos guardado en la carpeta assets.

Luego en nuestra aplicación en el onCreate de nuestra primera activity instanciamos un DataBaseHelperSqlFromFile y llamamos al método createDataBase.

DataBaseHelperSqlFromFile myDbHeper;
 
@Override
public void onCreate(Bundle savedInstanceState) {
	try{
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myDbHelper = new DataBaseHelperSqlFromFile(this);
        myDbHelper.createDataBase(this);
	} catch (IOException ioe) {
 		throw new Error("Unable to create database");
 	}
}

¿Te ha sido útil este artículo?

189 Valoración: 6.1/10 (9 votos)

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Otros idiomas
Categorías
support
Sitios
Herramientas