PDA

Ver la Versión Completa : Generar apk con base de datos sqlite


marquake
27/01/12, 08:58:17
Hola una vez más!

Tengo una pequeña duda. Estoy haciendo una aplicación para android y mi aplicación utiliza base de datos sqlite, la base de datos tiene un tamaño de unos 3 megas.

El caso es que quiero probarla en mi teléfono y cuando genero la aplicación me genera un apk de 280 Kb, entonces ahí no va ni de coña la base de datos. No se como hacer para que vayan las dos juntas.

He preguntado a algún colega y me ha dicho que se puede crear la base de datos en ejecución la primera vez y eso lo sabia, en el metodo del datahelper pero claro... como voy a hacer eso si para mi aplicación tendría que hacer como 4000 inserts. Además, lo de crear la base de datos es para que cuando de un problema de que no la encuentra no pete la aplicación...

Como hago esto? :pensando:

Gracias!!!

Pikoh
27/01/12, 17:21:54
Yo te cuento como lo he hecho yo en alguna ocasion. Es un poco cutre pero funciona. Yo incluyo los datos de la bbdd en un fichero de texto en csv y en la primera ejecucion creo la base sqlite y meto todos los datos. Se que hay alguna otra manera,pero a mi esta me ha dado buenos resultados si no hay una cantidad excesiva de registros.

Enviado desde mi Galaxy Nexus usando Tapatalk

pmaicas
28/01/12, 11:34:17
Mete la base de datos en assets, y en la primera ejecucion la copias a la memoria o a la sdcard, puedes aprovechar para comprimirla y que ocupe menos espacio (en assets).

Tambien la puedes tener en un servidor en internet, y la bajas a la primera ejecucion.

marquake
28/01/12, 23:56:14
Yo te cuento como lo he hecho yo en alguna ocasion. Es un poco cutre pero funciona. Yo incluyo los datos de la bbdd en un fichero de texto en csv y en la primera ejecucion creo la base sqlite y meto todos los datos. Se que hay alguna otra manera,pero a mi esta me ha dado buenos resultados si no hay una cantidad excesiva de registros.

Enviado desde mi Galaxy Nexus usando Tapatalk

esa es la ultima opcion que queria usar... como dices tu, es un poco mas cutre y si no consigo otra forma usare esa. queria evitarlo porque mi base de datos tiene 4000 registros y ocupa entre 3 y 4 megas.

gracias!

Enviado desde mi GT-I9000 usando Tapatalk

marquake
29/01/12, 00:07:05
Mete la base de datos en assets, y en la primera ejecucion la copias a la memoria o a la sdcard, puedes aprovechar para comprimirla y que ocupe menos espacio (en assets).

Tambien la puedes tener en un servidor en internet, y la bajas a la primera ejecucion.

buff... mirare por internet para ver que es lo de assets, que no lo de, aunque me suena.

y lo que dices de meterlo en la tarjeta...¿tengo que cambiar la ruta en la aplicacion entonces, no?
si meto mi aplicacion en el market, tengo que hacer que el usuario haga eso? es que sino me sigue pareciendo mejor forma lo de ejecutarlo desde el oncreate del databasehelper...

le dare una vuelta, gracias!


Enviado desde mi GT-I9000 usando Tapatalk

marquake
30/01/12, 20:19:23
Yo te cuento como lo he hecho yo en alguna ocasion. Es un poco cutre pero funciona. Yo incluyo los datos de la bbdd en un fichero de texto en csv y en la primera ejecucion creo la base sqlite y meto todos los datos. Se que hay alguna otra manera,pero a mi esta me ha dado buenos resultados si no hay una cantidad excesiva de registros.

Enviado desde mi Galaxy Nexus usando Tapatalk

Hola Pikoh,

estoy empezando a ver la cosa un poco mal... :) me podrías decir como haces eso, me refiero a la conversión del archivo. Yo se hacer insert pero exactamente tu que es lo que haces? abres el fichero y creas un INSERT?

Te agradecería que me echases una mano :D

Pikoh
31/01/12, 08:41:00
Claro que te echaré una mano :) Está tarde publico el código que utilizo para que veas como hacerlo. De todas maneras, como ya te he dicho nunca la he utilizado con mas de 300 registros y no se cuanto tiempo tardará el proceso con 4000 como comentas, pero al fin y al cabo es un proceso que solo se utiliza en la primera ejecucion.

Enviado desde mi Galaxy Nexus usando Tapatalk

marquake
31/01/12, 08:47:29
Perfecto! estaré esperando tu comentario como agua de mayo :)

La verdad es que tampoco creo que tarde mucho, y si tarda mucho me invento un "espere mientras la aplicación se instala", jajajaja!! :sisi1:

Gracias!!

PD: Esto no significa que no esté abierto a más opciones... si alguno tiene algo en el tintero que lo eche, que eso dentro no es bueno :)

Pikoh
31/01/12, 19:27:08
Bueno, al lio:

lo primero es meter el archivo con los datos en formato csv en res/raw. En mi caso separo los campos conun punto y coma y los registros van uno en cada linea.

Te pego ahora el codigo que uso en el dbhelper


public class dbHelper extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "tubase.db" ;
private static final int DATABASE_VERSION = 1;
InputStream inputStream;
public dbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);

inputStream = context.getResources().openRawResource(R.raw.nombr eDelCsv);

}

@Override
public void onCreate(SQLiteDatabase db) {
//aqui crea la tabla en tu base de datos
importaCsv();
}

private void importaCsv(){
String texto="";
String[] filas;
String[] datos;


texto=readTxt();
filas=texto.split("\r\n");
for(int i=0;i<filas.length;i++){
//cada uno es un registro
ContentValues values = new ContentValues();
datos=filas[i].split(";");

values.put("campo", datos[0]);
//asi para cada campo
db.insertOrThrow("tabla", null, values);
}


//aqui lee el fichero y devuelve un string con lo leido
private String readTxt(){

String s;

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

int i;
try {
i = inputStream.read();
while (i != -1)
{
byteArrayOutputStream.write(i);
i = inputStream.read();
}
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


s=byteArrayOutputStream.toString();

return s;


}
Bueno, es un esquema y no esta muy optimizado, pero te puede dar una idea de como funcionar. Si tienes alguna duda, preguntame y trataré de explicartelo mejor.

Un saludo

marquake
31/01/12, 23:23:01
De lujo Pikoh!

le acabo de echar un vistazo y está guay! ahora ya se me ha hecho un poco tarde pero en cuanto tenga un rato le voy a dar al codigamen a ver si me quito la base de datos de encima, que no me esperaba que me fuese a dar tanto lío.

Ah! una cosa. Con esto puedes probar en el ordenador con el emulador pero cuando lo pases al teléfono... ¿? Tienes que meter el fichero desde fuera o cuando generas el apk lo que metas en el res/raw va dentro del apk.

Muchas gracias!!

PD: En la vida se me habría ocurrido que una cosa tan tonta como lo de la base de datos diese tanto lio...

Pikoh
01/02/12, 00:02:14
Lo que metes en raw va dentro del apk,no necesitas hacer nada mas. Ya me contaras como va la cosa :)

Enviado desde mi Galaxy Nexus usando Tapatalk

ezpiki
28/11/12, 23:35:52
Muchas gracias Pikoh, tu forma de cargar datos me ha sido de mucha ayuda y resulta la más elegante de las opciones.

ugarte
29/11/12, 11:55:21
Yo creo que creando la base de datos primero y guardándola en assest es más sencillo.
mírate este vídeo, por el minuto 50 te dice como meter una base de datos ya creada en la aplicación aunque te recomiendo que te le veas desde el 26 para que entiendas bien el código que ha ido haciendo.

Video: http://www.youtube.com/watch?v=lRm5MsGgifU&feature=share&list=PL7EA29F3B739286CA