Mi è parso di capire che crei il database alla prima esecuzione dell'installazione. Il mio caso era un pò diverso ma simile.
Io dovevo utilizzare un db.sqlite preesistente, che ho creato 'all'esterno' di eclipse (con sqlite database browser, un ottimo tools per linux), copiato nell'assets del progetto e che veniva copiato sul device soltanto se una mia funzione, checkDataBase, ne verificava la presenza e tornava un false.
In particolare, nella classe SQLiteAdapter ho evitato di sfruttare onCreate e OnUpgrade, perchè inevitabilmente la copia dall'assets falliva, visto che l'istanziamento della classe mi creava un db vuoto sul device e successivamente falliva la 'copia' (che in questo caso si trasformava in una sovrascrittura) sul device.
Ho quindi risolto con uno sporco trucco di programmazione:
1) Quando istanzio SQLiteAdapter non faccio nulla (non creo db, alloco solo l'oggetto). Quindi onCreate e OnUpgrade li lascio vuoti.
2) prima del richiamo del metodo 'getReadableDatabase' o getWritableDatabase' (che creano un dbvuoto se sul device manca<- hot) eseguo un checkDb per controllare la sua esistenza sul device. se non c'è (equivalente al controllo dell'onCreate) lo copia altrimenti utilizza quello che già è presente:
codice:
public void copyDatabase() throws IOException {
if (controlloEsistenzaDb()) {
}else{
InputStream assetsDB = context.getAssets().open("dbtest.db");
OutputStream dbOut = new FileOutputStream("/data/data/mia.applicazione.test/sqliteAndroid.db");
byte[] buffer = new byte[1024];
int length;
while ((length = assetsDB.read(buffer))>0){
dbOut.write(buffer, 0, length);
}
dbOut.flush();
dbOut.close();
assetsDB.close();
}
}
codice:
public boolean controlloEsistenzaDb() {
File dbFile = new File(DB_PATH + MYDATABASE_NAME);
return dbFile.exists();
}