【问题标题】:How to delete an item from ListView and also delete it on Firebase?如何从 ListView 中删除一个项目并在 Firebase 上删除它?
【发布时间】:2020-11-14 06:05:59
【问题描述】:

我的问题是,如果我尝试删除我的 ListView 上的一个项目,所有数据都将被删除到 listview 和我的 firebase 实时数据库上。我想要的是,如果我长按一个项目,只会删除该项目,而不是ListView 上的所有项目。谢谢你。任何帮助表示赞赏

这是我声明的:

 MatkulAdapter matkulAdapter = null;
 Matkul matkul;
 DatabaseReference root = FirebaseDatabase.getInstance().getReference();
 DatabaseReference dbReference = root.child("MataKuliah");

这是删除项目的代码:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    Matkul item = matkulAdapter.getItem(position);
                    matkulAdapter.remove(item);
                    dbReference.removeValue();
                    matkulAdapter.notifyDataSetChanged();
     return true;
                }
            });

这是我的数据库:

This is my database

编辑问题

我也用 .child 尝试了这段代码,但数据只在 ListView 上删除。因此,当我重新打开 ListView 时,数据会返回。

   listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Matkul item = matkulAdapter.getItem(position);
                matkulAdapter.remove(item);
                dbReference.child(item.getNamaMatkul()).removeValue();
                matkulAdapter.notifyDataSetChanged();

【问题讨论】:

    标签: java android firebase listview firebase-realtime-database


    【解决方案1】:

    您需要在第二个孩子中传递您的 Firebase 项目 ID (15955880552231),如下代码:

    Query query = rdbReference.orderByChild("namaMatkul").equalTo(item.namaMatkul);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot itemSnapshot: dataSnapshot.getChildren()) {
            appleSnapshot.getRef().removeValue();
            matkulAdapter.remove(item);
            matkulAdapter.notifyDataSetChanged();
        }
    }
    
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e(TAG, "onCancelled", databaseError.toException());
    }});
    

    【讨论】:

    • 谢谢先生,但是很抱歉,如何获取 firebaseItemID?我该如何申报?
    • 使用点击监听器中的代码查找特定项目
    • 非常感谢先生!该代码正在运行,但有一个小错误,如果我删除一个项目,它将更改为其他数据或数据将加倍,但是当我先返回然后再次打开它时,它会从列表视图中消失。非常感谢先生
    • 这只是sn-p,需要自己开发逻辑;)
    【解决方案2】:

    当您使用以下代码行时:

    dbReference.removeValue();
    

    MataKuliah 下的所有内容都将被删除。如果只需要删除1595588052231 孩子,那么只需使用以下代码行:

    dbReference.child("1595588052231").removeValue();
    

    更好的方法可能是将1595588052231 作为uid 属性的值存储在数据库中,然后使用:

    dbReference.child(item.getUid()).removeValue();
    

    【讨论】:

    • 谢谢先生,但是如果我想删除 MataKuliah 上的随机项目怎么办?我尝试此代码dbReference.child(item.getUid()).removeValue(); 但在 getUid() 上出现错误
    • 您有一个错误,因为您应该在 Matkul 类中添加一个名为 uid 的新属性和相应的 getUid() getter。在您的1595588052231 节点下的数据库中,您还应该拥有应该拥有相同1595588052231 值的uid 属性。然后一切都会正常工作。如需随机取值,请查看this
    • 我已经在Matkul 上添加了private String uid 并获取了getUid(),但是得到了这个错误Can't pass null for argument 'pathString' in child()
    • 发生这种情况是因为您尝试从数据库中获取的值确实存在。正如我之前所说,您还应该将其添加到数据库中。所以你有namaDosennamaMaktul,加上uid,其值为1595588052231
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多