将数据添加到Firebase数据库中的特定位置

时间:2017-01-31 07:07:31

标签: android firebase firebase-realtime-database

我在Firebase中有以下数据库结构。它是管理数据库中用户及其数据的一种非常标准的方法。我还利用了FirebaseUI中的FirebaseRecyclerAdapter

-root
 -users
   -user1
     -item0
     -item1
     -item2
     ...
   -user2
   ...

现在我想实现滑动删除/撤消功能。对于滑动删除部分,我已实施ItemTouchHelper.SimpleCallback方法来捕获onSwiped状态。在回调中,我只需使用

更新数据库

mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();

以这种方式,刷新的项目立即被删除在数据库中。但是,当我尝试恢复它时。我无法插入到原来的位置。例如,

@Override
        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
            //get the location of swiped item. 
            final int indexOfDeletedItem = viewHolder.getAdapterPosition();

            //I cached the item in case I need to restore it.
            final ITEM deletedItem = mFirebaseAdapter.getItem(indexOfDeletedItem);

            //remove the item on swipe
            mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();

            Snackbar.make(findViewById(R.id.myCoordinatorLayout), "Deleted Item", Snackbar.LENGTH_LONG)
                    .setAction("UNDO", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                          //When user want to restored the deleted item
                          //I need to add the deleted data back to database.
                 mFirebaseAdapter.getRef(indexOfDeletedItem).push()setValue(deletedItem);

                                                   }
                         }).show();
    }

我无法正确地将数据插入(添加)到特定位置 而不会覆盖它。 我认为项目的索引在我调用{{}后立即更新1}}

例如,对于mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();,我user1的索引为item0

带有索引0

item1 索引1

item2

2

如果有办法让它回到

 index     0      1         2

       item0 --> item1 --> item2   //now swipe on item1

       item0 --> item2             //now user click undo

       item0 --> item1             //item2 gets overwritten 

就我而言,我总是覆盖 item0 --> item1 --> item2 上的数据。

我正在寻找一个API来将节点插回数据库而不会覆盖它。换句话说,如何将节点(item1)推送到之前的位置?

1 个答案:

答案 0 :(得分:1)

问题是,当您还原项目时,适配器的引用会更改,并且您正在接收不同的引用。在删除项目之前,只需创建Databasereference的本地副本。 E.g。

ref.setValue(deletedItem);

稍后在小吃栏行动中你可以打电话:

{{1}}