All'avvio dell'applicazione viene definita la base dati (solo la prima volta), cancellati i dati già esistenti ed infine caricati alcuni dati d'esempio, giusto
per visualizzare qualcosa nell'activity principale del progetto. Vediamo la classe che rappresenta l'application del nostro progetto Android d'esempio.
public class KriptonExampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// inizializziamo libreria
KriptonLibrary.init(this);
BindEsempioDataSource db = BindEsempioDataSource.instance();
db.execute(daoFactory -> {
DaoArtistaImpl daoArtista = daoFactory.getDaoArtista();
DaoAlbumImpl daoAlbum = daoFactory.getDaoAlbum();
DaoCanzone daoCanzone =daoFactory.getDaoCanzone();
daoAlbum.deleteAll();
daoArtista.deleteAll();
Artista artista = new Artista();
artista.nome = "Alfonso Mago";
artista.singer = true;
daoArtista.insert(artista);
for (int i = 0; i < 1; i++) {
Album album = new Album();
album.setArtistId(artista.getId());
album.setDataUscita(new Date((new java.util.Date()).getTime()));
album.nome = "Correndo sul mare Vol. "+i;
daoAlbum.insert(album);
for (int j = 0; j < 4; j++) {
Canzone canzone = new Canzone();
canzone.setAlbumId(album.getId());
Set<String> tags=new HashSet<String>();
tags.add("Heavy Metal");
tags.add("Chili out");
canzone.setTags(tags);
canzone.nome="Canzone number "+j;
daoCanzone.insert(canzone);
}
}
return TransactionResult.COMMIT;
});
}
}
Con l'esecuzione del codice, sul log cat vengono generate le seguenti righe di log, utili a capire a runtime cosa succede:
Come si vede dal log tutte le operazioni SQL, comprese quelle di creazione del database sono tracciate. Vediamo ora una parte del codice dell'activity al fine di capire come interagire con la base dati nell'activity o nei fragment.
Nell'activity viene caricato e visualizzato l'elenco delle canzoni dalla base dati.
public class MainActivity extends AppCompatActivity {
/**
* Async task per lavorare con il db su un thread che non sia il main thread
*/
private BindEsempioAsyncTask.Simple<List<Canzone>> asyncTask=new BindEsempioAsyncTask.Simple<List<Canzone>>() {
@Override
public List<Canzone> onExecute(BindEsempioDataSource dataSource) throws Throwable {
return dataSource.getDaoCanzone().selectAll();
}
@Override
public void onFinish(List<Canzone> result) {
mAdapter.updateValues(result);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
..
// eseguiamo il caricamento del db
asyncTask.execute();
..
});
}
Come si evince dal codice, per evitare di lavorare con il database sul thread UI (o main) si è utilizzato un async task generato da Kripton. Questo async task, a
differenza di quelli "standard", può essere riutilizzato diverse volte e consente di lavorare con il datasource generato in modo agevole (si veda il metodo
onExecute
). Ovviamente si poteva utilizzare event bus come sistema alternativo per fare la stessa cosa.