2013-02-15 17 views
5

Dire che ho la seguente struttura:Firebase: come inserire la transazione?

{ 
    "-InSwU2yHOEHwhP_m4_n" : { 
    ".priority" : 0.0, 
    "name" : "abc" 
    }, 
    "-InSw_P0j8A-0Njj0Uvf" : { 
    ".priority" : 1.0, 
    "name" : "def" 
    } 
} 

vorrei aggiungere un altro elemento simile con un GUID come chiave e la priorità è uguale al numero di elementi attualmente presenti (in questo caso 2). Il risultato dovrebbe essere simile a questo:

{ 
    "-InSwU2yHOEHwhP_m4_n" : { 
    ".priority" : 0.0, 
    "name" : "abc" 
    }, 
    "-InSw_P0j8A-0Njj0Uvf" : { 
    ".priority" : 1.0, 
    "name" : "def" 
    }, 
    "-InSxV-RVkZ07_f3uDnJ" : { 
    ".priority" : 2.0, 
    "name" : "ghi" 
    } 
} 

Nota che, poiché più client potrebbero provare ad aggiungere tale elemento, allo stesso tempo, questo deve essere una transazione.

Qualche idea?

risposta

3

Quando si utilizza push(), a ogni articolo viene assegnato un ID univoco. Quindi una transazione non sarebbe necessaria (non possono esserci collisioni).

Se si desidera che i record siano univoci per priorità (che assomiglia a ciò che si sta tentando di ottenere), penso che si debba semplicemente utilizzare la priorità come ID.

quindi è possibile utilizzare una transazione per assicurarsi che due clienti non spingere al tempo stesso:

FB.child(path).transaction(function(current_val) { 
    if(current_val === null) { 
     /* set the value here */ 
    } 
    /* do nothing; transaction fails because it was already written */ 
}, function(success) { 
    /* transaction done */ 
}); 

Tuttavia, se si utilizza la priorità come un ID univoco, forse questo ha bisogno di essere ripensato ; questo è davvero il lavoro degli ID e fa un ottimo lavoro; i record vengono anche mantenuti nell'ordine in cui sono inseriti, quindi il contatore non è necessario nella maggior parte dei casi.

+0

Grazie Kato! Dovrei anche notare che se si utilizza push(), gli elementi verranno visualizzati nell'ordine in cui sono stati aggiunti (purché siano stati inviati dallo stesso client. Altri client potrebbero avere orologi distorti, che cerchiamo di compensare , ma non sempre con successo al 100%). –

Problemi correlati