Usar nuestra propia sqlite en Android
De WikiCode
| Tweet |
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
- Indices _id
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"); } }