DevCorner: implementiamo i Datastore di Dropbox

Roberto Orgiu
Roberto Orgiu
DevCorner: implementiamo i Datastore di Dropbox

Dropbox ci fornisce da diversi anni uno spazio gratuito sul cloud più o meno spazioso a seconda del nostro account ma, oltre ad usarlo per memorizzare i nostri file, sapevate di poterlo usare per tenere un backup dei dati della vostra applicazione?
Grazie alle sue API è infatti possibile salvare sull'account dell'utente tutta una serie di informazioni: in questo tutorial, andremo ad esplorare le possibilità offerte dal Datastore, una base dati NoSQL che ci permette di immagazzinare oggetti, recuperarli e cancellarli, con la particolarità di non occupare lo spazio dell'utente se non superiamo i 5 MB di dati.

Esaurita la premessa,non ci resta che iscriverci al portale per sviluppatori di Dropbox (basterà effettuare un semplice login con il nostro account), scaricare le librerie, creare una nuova app e scegliere di utilizzare solamente la tecnologia del Datastore. A questo punto, inseriamo il nome dell'applicazione e prendiamo nota dei valori app key e app secret, che ci serviranno a breve.

Dropbox-Datastore-appCreate

Creiamo quindi un nuovo progetto nel nostro IDE preferito e inseriamo tra le librerie necessarie quelle di Dropbox. Una volta copiati tutti i file nella nostra cartella libs (e indicate le dipendenze se usate IntelliJ)

Dropbox-Datastore-libs

passiamo alla nostra Activity, nel cui metodo increate dovremo inizializzare le API, passando al DbxAccountManager il Context dell'app e i due valori di cui abbiamo preso nota poco fa.

dbxAccountManager = DbxAccountManager.getInstance(getApplicationContext(),
DropboxData.APP_KEY,
DropboxData.APP_SECRET);

A questo punto, controlliamo se l'account Dropbox è stato collegato: in caso affermativo, ne prendiamo una referenza, apriamo il datastore e la tabella (se non esistono, verranno automaticamente creati);

if(dbxAccountManager.hasLinkedAccount()){
dbxAccount = dbxAccountManager.getLinkedAccount();
try {
dbxDatastore = DbxDatastore.openDefault(dbxAccount);
dbxTable = dbxDatastore.getTable("Test_AW.it");
} catch (DbxException e) {
showError(e);
}}

Passiamo quindi a richiedere la connessione dell'account Dropbox: in un ambiente di produzione conviene sempre controllare che l'account non sia già stato collegato, prima di fare la richiesta (in caso di connessione già stabilita, se viene effettuata una nuova richiesta, l'app potrebbe crashare).

dbxAccountManager.startLink(DropboxActivity.this,DropboxData.REQUEST_CODE);

Ora che abbiamo richiesto a Dropbox la connessione dell'account, dobbiamo analizzarne il valore di ritorno, che andremo a gestire nell'override del metodo onActivityResult. Nel nostro esempio non facciamo altro che prendere un riferimento al profilo e mostrare i bottoni che andremo ad implementare, ma è in linea di massima tutto quello che sarà necessario eseguire nella maggior parte delle situazioni.

if (requestCode == DropboxData.REQUEST_CODE)
if (resultCode == Activity.RESULT_OK)
dbxAccount = dbxAccountManager.getLinkedAccount();

Adesso, non ci resta che provare a salvare un oggetto, e lo faremo con due semplici chiamate: una volta che siamo sicuri di avere un account collegato (ricordatevi di eseguire sempre il controllo, altrimenti potreste incappare in crash inspiegabili) andremo a chiamare i metodi insert() e set() della nostra tabella, passando come parametri a quest'ultimo l'header della colonna e il valore che vogliamo venga salvato. Notiamo che, per salvare più colonne, è necessario concatenare più chiamate a set() e, una volta impostate tutte le informazioni, basterà richiamare il metodo sync() del Datastore per ottenere il salvataggio dei nostri dati.

dbxTable.insert().set(DropboxData.DB_FIELD,DropboxData.DB_CONTENT);
dbxDatastore.sync();

Per quanto riguarda invece le operazioni di caricamento, modifica o eliminazione di un record, avremo bisogno di un riferimento allo stesso, che otterremo tramite un apposito helper che ci conviene sempre creare: attraverso un oggetto di tipo DbxField sarà possibile specificare quali campi vogliamo controllare e che valore devono avere. Passando quest'oggetto ad una query, otterremo il nostro record, che possiamo ritornare al chiamante.

DbxFields dbxFields = new DbxFields().set(DropboxData.DB_FIELD,DropboxData.DB_CONTENT);
DbxTable.QueryResult queryResults = dbxTable.query(dbxFields);
dbxRecord = queryResults.iterator().next();

Una volta ottenuto il record, attraverso gli appositi getter sarà possibile estrarne i valori ed utilizzarli senza troppi problemi.

dbxRecord.getString(DropboxData.DB_FIELD);

Per cancellare una entry, dovremo invece semplicemente richiamare il metodo deleteRecord() dal riferimento del record stesso e Dropbox si occuperà del resto.

dbxRecord.deleteRecord();

Ora che il nostro codice è a posto, non ci resta che mettere le mani sul nostro file Manifest, dove dovremo incollare le seguenti righe, preoccupandoci di inserire la nostra app key nello schema segnalato, anteponendo a questa stringa i caratteri "db-"

<activity android:name="com.dropbox.sync.android.DbxAuthActivity" />
<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:launchMode="singleTask" >
<intent-filter>
<data android:scheme="db-APP_KEY_QUI" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name="com.dropbox.sync.android.DbxSyncService"
android:enabled="true"
android:exported="false"
android:label="Dropbox Sync" />

A questo punto, la nostra app è pronta e possiamo compilarla: se invece di scrivere voi il codice, preferite dare un'occhiata al listato usato per l'esempio, troverete i sorgenti (e l'APK compilato) sul thread ufficiale del nostro forum.

Prima di salutarvi, è bene specificare che non è ancora il momento di fare totalmente affidamento su queste API per i vostri progetti, in quanto queste chiamate sono ancora in fase beta e potrebbero portare a comportamenti inaspettati.

Via: DevCorner