2015-05-10 9 views
9

All'interno di un'attività e senza alcuna connessione Internet, sto creando un ParseObject e facendo riferimento a un altro ParseObject e all'utente corrente al suo interno. Lo sto quindi reindirizzando al datastore locale, per il salvataggio successivo (queste classi e il datastore sono inizializzati correttamente).datastore parse.com non bloccando più di un oggetto non salvato

final Rating rating = new Rating(substationObjectId, data); 

    // inside constructor 
    put(KEY_OTHER_OBJECT, OtherObject.createWithoutData(OtherObject.class, substationObjectId)); 
    put(KEY_USER, ParseUser.getCurrentUser()); 

    rating.pin("unsent"); 

Seguo questo con una query veloce per recuperare tutti i voti da quel pin.

final ParseQuery<Rating> queryUnsent = ParseQuery.getQuery(Rating.class); 
queryUnsent.whereEqualTo(Rating.KEY_USER, ParseUser.getCurrentUser()); 
queryUnsent.fromPin("unsent"); 
final List<Rating> unsentRatings = queryUnsent.find(); 

Logger.d(LOG_TAG, "queryUnsent count = %d", unsentRatings.size()); 
for (Rating unsentRating: unsentRatings) { 
    Logger.d(LOG_TAG, "\tdatastore for %s with objectId='%s'", unsentRating().getName(), unsentRating.getObjectId()); 
} 

Il problema: sembra che un solo Rating sia bloccato. Un secondo rating non viene memorizzato, anche se l'analisi riporta il successo.

Prima pinning (null objectId è ok e atteso) di una Valutazione di rendimenti 'Albury' questi in una successiva get-tutto query sul perno:

queryUnsent count = 1 
datastore for Albury with objectId='null' 

In secondo luogo per 'Arapuni':

queryUnsent count = 1 
datastore for Albany with objectId='null' 

Altre cose cercato:

  • pinEventually ("non inviato")
  • perno() senza etichetta
  • save() immediatamente dopo e scartando l'eccezione collegamento
  • rimozione user = clausola utente corrente ovunque
  • query generali contro l'archivio dati nel loro insieme confermano che gli oggetti aggiuntivi non sono conservati a all

Dopo essere entrati online e aver salvato il Rating (che gli fornisce un objectId), un nuovo Rating offline verrà bloccato correttamente ma il problema si ripeterà con un secondo Rating offline.

Ho la sensazione che sia un bug con la libreria Android SDK di parse.com. Sembra che l'archivio dati imponga un vincolo univoco su objectId, ma gli oggetti non salvati non hanno ancora un oggetto ID.

Qualcun altro si è imbattuto in questo problema o può suggerire un lavoro in giro?

+0

Ho riscontrato anche problemi con voci puramente locali. I miei problemi riguardano tuttavia principalmente l'ottenimento di quegli oggetti sbloccati. – cYrixmorten

+0

Ho anche provato saveEventually() - solo un oggetto viene effettivamente salvato quando viene ripristinata la connettività. – Tom

+0

Appena notato ... nella prima riga di codice 'nuovo Rating (substationObjectId, data)' sembra che tu assegni un oggettoId alla Rating 'substationObjectId'. Questa potrebbe essere la causa del tuo problema, dal momento che non puoi avere più oggetti con lo stesso oggetto ID memorizzato. – cYrixmorten

risposta

3

Questo è veramente strano.

Come ho scritto nei commenti, i miei problemi riguardavano principalmente il recupero degli oggetti non salvati, quindi ho iniziato a creare un progetto che somigliasse a qualche comportamento della mia app con una dimostrazione riproducibile del problema.

Lo Studio Android progetto può essere trovato qui: https://www.dropbox.com/sh/6whcw0qa1wdmnl2/AAAeELECIxgDjfa5ICULn2Zya?dl=0

Sul progetto

L'idea che ho cercato di realizzare è quella di legare un compito (ParseObject) insieme ad una voce di registro (un altro ParseObject) e un JSONArray in un oggetto chiamato TaskSummaryHolder.

Avendo queste 3 entità collegate in locale, posso spingere molte informazioni nel JSONArray e solo periodicamente spingere le informazioni da JSONArray alla voce del registro.

L'oggetto di riepilogo che unisce tutto non è mai stato archiviato online.

Questo schema dovrebbe essere possibile applicare a un intervallo di attività diverse in modo che un'istanza di TaskSummaryHolder possa memorizzare eventi che si verificano in un periodo di tempo, mentre un'altra continua ad es. Voci GPS.

Attualmente ho qualcosa di simile a ciò che viene mostrato nel progetto in un'app live, ma a causa del problema non risolvente sto attualmente cancellando i riepiloghi invece di sbloccare (rimuovere colonne e bloccare).

Problema 1 unpinning

La mia prima osservazione è che

ParseObject.unpinAllInBackground(TaskSummaryHolder.PIN) 

non sempre funziona, mentre

ParseObject.unpinAllInBackground(TaskSummaryHolder.PIN, summaries) 

sembravano più affidabili. Un po 'strano se si deve interrogare prima di sbloccare se l'obiettivo è eliminare un pin dal datastore.

Problema 2 pinning

Con mia grande sorpresa ho incontrato esattamente il problema che si descrive. Nel progetto di test, prendo due attività online e aggiungo un'istanza TaskSummaryHolder a ciascuna di esse. Solo la prima istanza è stata bloccata localmente.

Ispirato dalla descrizione del problema, ho provato a lasciarlo pin e quindi a salvare (vedere TaskSummaryHolder riga 114).

Dopo questo ha funzionato un non è stato in grado di riprodurre il problema da allora in avanti. Sia il blocco che lo sblocco si sono comportati come previsto anche dopo la disinstallazione e/o il riavvio del telefono.

Potrebbe essere interessante provare a eseguire il progetto e vedere come si comporta.

+0

Grazie per la risposta :). Cercherò di trovare il tempo per controllare il tuo progetto - le cose sono un po 'frenetiche per me! – Tom

+0

Sembra fantastico e non c'è fretta :-) – cYrixmorten

Problemi correlati