【问题标题】:Delete from firebase using a recyclerview android使用recyclerview android从firebase中删除
【发布时间】:2019-11-25 14:31:20
【问题描述】:

我已经设置了一个 RecyclerViewAdapter,我可以完美地添加帖子,但是在 firebase 中我只定义了一个集合而不是文档,所以 firebase 生成一个随机字符串,我可以获得字符串详细信息,但我不知道如何与 recyclerview 协调,这样当我滑动删除它时,它会获取相关的字符串并将其从 firebase 中删除,目前它只需要创建最新的字符串并将其删除。

firebase database string My app showing the same reference 如您所见,我可以获取字符串值,甚至使用 getter 和 setter 将其存储为字段,但我不知道如何引用它以删除正确的文档。

我的对象在一个活动(活动 1)中创建并在另一个活动(活动 2)中显示。

活动一:

filepath.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
   @Override
   public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

   filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
   @Override
   public void onSuccess(Uri uri) {
   String imageUrl = uri.toString(); //creates a URL that links to the images


   final Journal journal = new Journal();
   journal.setTitle(title);
                                journal.setDescription(description);
                                journal.setImageUrl(imageUrl);
                                journal.setTimeAdded(new Timestamp(new Date()));
                                journal.setUsername(currentUserName);
                                journal.setUserId(currentUserId);
                                journal.setDocRef(documentId);

                            JournalApi.getInstance().setDocRef(journal.getDocRef());
                            collectionReference.document(documentId).set(journal).addOnSuccessListener(new OnSuccessListener<Void>() {


@Override
 public void onSuccess(Void aVoid) {
postJournalProgressBar.setVisibility(View.INVISIBLE);
Intent intent = new Intent(PostJournalActivity.this, JournalListActivity.class);
                                        startActivity(intent);
                                        finish();
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Toast.makeText(PostJournalActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
                                        Log.d(TAG, "onFailure: when saving the journal" + e.getMessage());
                                    }
                                });
                                //save a journal instance
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {

}
});
}
});
}}

活动二:

@Override
    protected void onStart() {
        super.onStart();
        collectionReference.whereEqualTo("userId", JournalApi
                .getInstance()
                .getUserId())
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        if (!queryDocumentSnapshots.isEmpty()) {
                            for (QueryDocumentSnapshot journals : queryDocumentSnapshots) {
                                /**/
                                journal = journals.toObject(Journal.class);
                                journalList.add(journal);

                                docList.add(journal.getDocRef());


                            }
                            journalRecyclerViewAdapter = new RecyclerViewAdapter(JournalListActivity.this, journalList);
                            recyclerView.setAdapter(journalRecyclerViewAdapter);
                            journalRecyclerViewAdapter.notifyDataSetChanged();
                        } else {
                            noJournalEntry.setVisibility(View.VISIBLE);
                        }
                    }
                })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                }
            });

}



//Swipe To Delete
    ItemTouchHelper.SimpleCallback swipeToDelete = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }
        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            //removes the data from the recyclerview and adds corrects the screen accordingly
            journalList.remove(viewHolder.getAdapterPosition());
        journalRecyclerViewAdapter.notifyDataSetChanged();
        journalRecyclerViewAdapter.deleteItem(viewHolder.getAdapterPosition());

        deleteItem();
    }
};

private void deleteItem() {

    collectionReference.document(testDocumentId).set(journal);


    db.collection("Journal")
            .document(testDocumentId)
            .delete().addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Toast.makeText(JournalListActivity.this, "Deleted?", Toast.LENGTH_SHORT).show();
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(JournalListActivity.this, "NOPE", Toast.LENGTH_SHORT).show();
        }
    });

我可以引用 recyclerview 适配器,以便从手机中删除视图并正确更新,但是一旦我刷新它就会回来,因为我无法从数据库中删除

【问题讨论】:

    标签: android firebase android-recyclerview google-cloud-firestore


    【解决方案1】:

    据我所知,当您在查询的 onSuccess 处理程序中从 Firestore 获取文档时,您会做两件事:

    1. 您将文档的数据添加到journalList 作为Journal
    2. 您将文档的引用添加到docList

    这意味着当您从journalList 中删除Journal 时,您还可以从docList 中获取/删除引用并从Firestore 中删除文档。

    代码应如下所示:

    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        int position = viewHolder.getAdapterPosition();
        collectionReference.document(docList.get(position)).delete();
        docList.remove(position).delete();
        journalList.remove(position);
        journalRecyclerViewAdapter.notifyDataSetChanged();
        journalRecyclerViewAdapter.deleteItem(viewHolder.getAdapterPosition());
    }
    

    【讨论】:

    • .delete 方法不存在,并且没有其他选项可供选择,我无法在此处添加图片以显示(或者至少我不知道如何到)。我的日记设置如下: private List journalList = new ArrayList();私有列表 docList = new ArrayList();
    • 有趣。我假设您将DocumentReference objects 存储在docList 中,它们应该有一个delete() 方法。如果您在调试器中签入docList.get(position),它是DocumentReference 吗?我想这与以下问题相同:journal.getDocRef() 返回什么?
    • 我称它为 docRef,因为它是在 firebase 中保存文档的字符串引用,但我理解你的逻辑,因为 firebase 有一个 DocumentReference 方法。如果您查看我的原始代码,您会发现下面是实际的删除方法,所以我现在(基于您的代码)正在尝试在 deleteItem(); 之后执行 .remove(position);
    • 如果docList.get(position) 包含文档的键,您可以通过基于对集合的引用和该键创建一个新的DocumentReference 来删除它。我更新了我的答案以表明这一点。请注意,您可以使用journals.getId() 获取QueryDocumentSnapshot 的ID。
    • DUDEEEEE...谢谢。我已经为此工作了 2 周,但我就是想不通。如果我创建文档引用,我知道如何删除,因为我知道它的名称,但我无法找出随机字符串。谢谢。
    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多