Удалите все вложенные коллекции определенного документа (например, документ документооборота) в коллекции, когда приложение убито в kotlin / android - PullRequest
0 голосов
/ 16 марта 2019

У меня есть коллекция, у которой есть подколлекция. Я не хочу удалять коллекцию, но я хочу удалить все подколлекции определенного документа (т.е. документа d.e.currentuser), когда пользователь убивает приложение.

Я попытался сделать это, используя пакетные операции со стороны клиента. Но тогда это только удаляет данные документов коллекции, но не удаляет вложенную коллекцию:

В моем случае он удаляет игровую почту (которая является коллекциями (AllUsers) -> document-> value поля), но я хочу знать, как удалить вложенную коллекцию (Запрос) конкретного документа.

Скриншот Firestore: enter image description here

Код Котлина, используемый для удаления данных коллекции:

class onAppKilled: Service() {
    private lateinit var mFirestore:FirebaseFirestore
    private var mAuth: FirebaseAuth? = null
    lateinit var currentUser: FirebaseUser
    private val EXECUTOR = ThreadPoolExecutor(2, 4,
            60, TimeUnit.SECONDS, LinkedBlockingQueue())
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }


    override fun onTaskRemoved(rootIntent: Intent?) {

        mFirestore= FirebaseFirestore.getInstance()
        mAuth = FirebaseAuth.getInstance()
        currentUser= mAuth!!.currentUser!!

        currentUser.delete().addOnCompleteListener(OnCompleteListener {task->
            if(task.isSuccessful){
                Toast.makeText(this@onAppKilled,"User Deleted", Toast.LENGTH_LONG).show()

            }else{
                Toast.makeText(this@onAppKilled,"User not deleted", Toast.LENGTH_LONG).show()

            }
        })
        val colref= mFirestore.collection("AllUsers")
        deleteCollection(colref,EXECUTOR)
    }
     fun deleteCollection(collection: CollectionReference, executor: Executor) {
        Tasks.call(executor, Callable<Void>{
            val batchSize:Int = 100
            var query = collection.orderBy(FieldPath.documentId()).limit(batchSize.toLong())
            var deleted = deleteQueryBatch(query)

            while (deleted.size>= batchSize) {
                val last = deleted[deleted.size - 1]
                query = collection.orderBy(FieldPath.documentId()).startAfter(last.getId()).limit(batchSize.toLong())

                deleted = deleteQueryBatch(query)
            }
            null
        })
    }
    @WorkerThread
    @Throws(Exception::class)
    fun deleteQueryBatch(query: Query): List<DocumentSnapshot> {
        val querySnapshot = Tasks.await(query.get())

        val batch = query.getFirestore().batch()
        for (snapshot in querySnapshot) {
            val a =SplitString(currentUser.email!!)
            if(snapshot.get("gamingfirstemail")==SplitString(currentUser.email!!)){
                batch.delete(snapshot.getReference())
            }
        }
        Tasks.await(batch.commit())
        return querySnapshot.getDocuments()
    }

    fun SplitString(str:String):String{
        val name=str.split("@")
        return name[0]
    }


}

При попытке удалить документ в подколлекции тем же способом, что и выше, и заменить, я получаю следующие ошибки в моем logcat:

 val colref= mFirestore.collection("AllUsers").document("sira").collection("Request")

03-17 16: 48: 29.098 2759-3249 /? E / ConnectivityService: Удалено исключение RemoteException при попытке отправить сообщение обратного вызова для NetworkRequest [id = 1550, legacyType = -1, [Возможности: INTERNET & NOT_RESTRICTED & TRUSTED]] 03-17 16: 48: 29.157 3320-3566 /? E / Surface: getSlotFromBufferLocked: неизвестный буфер: 0x7f36f6f440 03-17 16: 48: 36.023 21400-21456 /? E / MAL-Daemon: (void * rilproxy_task_hdl (, 439) rilproxy_task_hdl (), событие приема = 401 03-17 16: 48: 39.771 16200-17680 /? E / NativeCrypto: ssl = 0xcf1469c0 cert_verify_callback x509_store_ctx = 0xe5274b44 arg = 0x0 03-17 16: 48: 39.772 16200-17680 /? E / NativeCrypto: ssl = 0xcf1469c0 cert_verify_callback, вызывающий verifyCertificateChain authMethod = ECDHE_RSA 03-17 16: 48: 40.224 16200-17682 /? E / NativeCrypto: ssl = 0xd0e6a640 cert_verify_callback x509_store_ctx = 0xe4afeb44 arg = 0x0 ssl = 0xd0e6a640 cert_verify_callback, вызывающий verifyCertificateChain authMethod = ECDHE_RSA 03-17 16: 48: 40.243 16200-17683 /? E / NativeCrypto: ssl = 0xd0e6b040 cert_verify_callback x509_store_ctx = 0xd4952b44 arg = 0x0 03-17 16: 48: 40.244 16200-17683 /? E / NativeCrypto: ssl = 0xd0e6b040 cert_verify_callback, вызывающий verifyCertificateChain authMethod = ECDHE_RSA 03-17 16: 48: 40.340 12522-17744 /? E / NativeCrypto: ssl = 0x7f732cee80 cert_verify_callback x509_store_ctx = 0x7f592fe5b0 arg = 0x0 ssl = 0x7f732cee80 cert_verify_callback с вызовом verifyCertificateChain authMethod = ECDHE_RSA 03-17 16: 48: 46.024 21400-21456 /? E / MAL-Daemon: (void * rilproxy_task_hdl (, 439) rilproxy_task_hdl (), событие приема = 401 03-17 16: 48: 48.778 17207-17760 /? E / NativeCrypto: ssl = 0xd025f000 cert_verify_callback x509_store_ctx = 0xd4eb4764 arg = 0x0 03-17 16: 48: 48.779 17207-17760 /? E / NativeCrypto: ssl = 0xd025f000 cert_verify_callback, вызывающий verifyCertificateChain authMethod = ECDHE_RSA 03-17 16: 48: 48.800 17207-17762 /? E / NativeCrypto: ssl = 0xd0260180 cert_verify_callback x509_store_ctx = 0xd4b84764 arg = 0x0 ssl = 0xd0260180 cert_verify_callback с вызовом verifyCertificateChain authMethod = ECDHE_RSA

Как удалить данные вложенных коллекций для конкретного документа со стороны клиента?

1 Ответ

2 голосов
/ 17 марта 2019

Как я вижу в вашем коде, вы пытаетесь удалить все документы, которые существуют в коллекции colref. Используя этот код, вы можете удалить все документы, но не подколлекции, которые существуют в каждом документе. Скорее всего, эти документы теперь отображаются в курсив , так как больше нет свойств. Но обратите внимание, это ожидаемое поведение.

В Cloud Firestore документы и вложенные коллекции не работают как файлы и каталоги файловой системы. Подколлекции никак не связаны с родительским документом. Поэтому, когда вы удаляете коллекцию, находя все документы в ней, это не означает, что вы также удаляете все вложенные коллекции, которые существуют в этих документах.

Таким образом, чтобы иметь возможность удалить всю коллекцию, сначала вам нужно найти все вложенные коллекции, которые существуют на самом низком уровне, в вашем случае Request. Если в этих документах нет других вложенных коллекций (я не вижу на предоставленном вами скриншоте), сначала вам нужно найти все существующие там документы и удалить их. Только тогда, в качестве второй операции, вы должны удалить документы, которые существуют под вашей коллекцией AllUsers.

В заключение удалите все вложенные коллекции с самого низкого уровня до самого высокого уровня.

Согласно официальной документации, для больших коллекций операция удаления не рекомендуется, поскольку она имеет негативные последствия для безопасности и производительности. Вы все еще можете сделать это для небольших коллекций документов. Для больших коллекций я все еще рекомендую использовать Облачные функции .

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