Как вы перебираете документы в подсборке внутри транзакции для firestore android? - PullRequest
0 голосов
/ 07 мая 2018

Я хочу иметь возможность удалить все документы в рамках коллекции как часть транзакции в Android. Я нашел следующий код, но это для Node.js

// First perform the query
db.collection('job_skills').where('job_id','==',post.job_id).get()
.then(function(querySnapshot) {
    // Once we get the results, begin a batch
    var batch = db.batch();

    querySnapshot.forEach(function(doc) {
        // For each doc, add a delete operation to the batch
        batch.delete(doc.ref);
    });

    // Commit the batch
    return.batch.commit();
}).then(function() {
  // Delete completed!
  // ...
}); 

Любая помощь будет принята с благодарностью!

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2018

То, что я вижу в вашем коде, не называется транзакцией, оно называется партией. Поэтому, если вы хотите удалить все документы в коллекции с помощью Android SDK, я рекомендую использовать следующие методы:

private void deleteCollection(final CollectionReference collection, Executor executor) {
    Tasks.call(executor, new Callable<Object>() {
        @Override
        public Object call() throws Exception {
            int batchSize = 10;
            Query query = db.collection("job_skills").whereEqualTo("job_id", job_id);
            List<DocumentSnapshot> deleted = deleteQueryBatch(query);

            while (deleted.size() >= batchSize) {
                DocumentSnapshot last = deleted.get(deleted.size() - 1);
                query = collection.orderBy(FieldPath.documentId()).startAfter(last.getId()).limit(batchSize);

                deleted = deleteQueryBatch(query);
            }

            return null;
        }
    });
}

А вот метод deleteQueryBatch():

@WorkerThread
private List<DocumentSnapshot> deleteQueryBatch(final Query query) throws Exception {
    QuerySnapshot querySnapshot = Tasks.await(query.get());

    WriteBatch batch = query.getFirestore().batch();
    for (DocumentSnapshot snapshot : querySnapshot) {
        batch.delete(snapshot.getReference());
    }
    Tasks.await(batch.commit());

    return querySnapshot.getDocuments();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...