Android 数据库错误:事务被后续设置“如何解决”覆盖

Android 数据库错误:事务被后续设置“如何解决”覆盖,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我知道这是一个常见的错误,所以有很多线程。但什么都帮不了我 我的问题是: 我的数据库结构: 根 /职位/ /用户帖子/用户ID/ 每个帖子都有几个属性,包括: 利克蒙特 likes>id:true 无论何时创建帖子,它都存储在/posts/和/user posts/节点中。但当我喜欢这篇文章时,它会在一篇文章中更新,在另一篇文章中失败,出现问题标题中提到的错误 用于在firebase DB中插入帖子的代码: Map<String, Object> childUpdates = new

我知道这是一个常见的错误,所以有很多线程。但什么都帮不了我

我的问题是:

我的数据库结构: 根 /职位/ /用户帖子/用户ID/

每个帖子都有几个属性,包括: 利克蒙特 likes>id:true

无论何时创建帖子,它都存储在/posts/和/user posts/节点中。但当我喜欢这篇文章时,它会在一篇文章中更新,在另一篇文章中失败,出现问题标题中提到的错误

用于在firebase DB中插入帖子的代码:

Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/posts/" + key, feedValues);
childUpdates.put("/user-posts/" + userId + "/" + key, feedValues);
dbRef.updateChildren(childUpdates);
由于like计数需要在/user posts/和/posts/中更新,因此我使用相应的数据库引用调用上述方法两次

参数

  • 如果失败,则节点/user posts/和/posts/都应该失败。为什么这两个位置都没有失败
  • 它只会在第一次like时失败,但如果您连续执行like>INVISE>like>INVISE,则从第二次开始在两个位置都会成功。为什么会这样
  • 最重要的:只有当我喜欢朋友写的帖子时,错误才会出现。如果我喜欢我自己的帖子,没有错误

  • 解决了以下解决方法的问题。不知道这是否是正确的方法,但希望从其他人那里知道是否有更好的解决方案

    因为它只发生在第一次事务中,所以我尝试检查错误并再次重试第二次尝试中成功的相同操作

    @Override
            public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
                // Transaction completed
                Log.d(TAG, "updateLikeInServer:onComplete: " + databaseError);
                if (databaseError != null && databaseError.getCode() == DatabaseError.OVERRIDDEN_BY_SET) {
                    // Retry the same
                    updateLikeInServer(dbRef, userId);
                }
            } 
    

    上面的代码片段修复了我的问题。但如果可能的话,我很愿意听最好的答案。

    通过下面的解决方法解决了这个问题。不知道这是否是正确的方法,但希望从其他人那里知道是否有更好的解决方案

    因为它只发生在第一次事务中,所以我尝试检查错误并再次重试第二次尝试中成功的相同操作

    @Override
            public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
                // Transaction completed
                Log.d(TAG, "updateLikeInServer:onComplete: " + databaseError);
                if (databaseError != null && databaseError.getCode() == DatabaseError.OVERRIDDEN_BY_SET) {
                    // Retry the same
                    updateLikeInServer(dbRef, userId);
                }
            } 
    

    上面的代码片段修复了我的问题。但如果可能的话,我愿意听最好的答案。

    就我而言。我已经在我的手机上注册了2个谷歌账户。然后我在我的应用程序中切换了帐户,然后这个错误开始出现在我的一个计数器上(也使用事务)。但是你打两次电话的方法奏效了。奇怪的事情,对吧?它很奇怪,而且对我来说似乎是个虫子。可能会由Firebase团队澄清。就我而言。我已经在我的手机上注册了2个谷歌账户。然后我在我的应用程序中切换了帐户,然后这个错误开始出现在我的一个计数器上(也使用事务)。但是你打两次电话的方法奏效了。奇怪的事情,对吧?它很奇怪,而且对我来说似乎是个虫子。可能会被Firebase小组澄清。我不知道是谁干的。但可能会喜欢听更好的解决方案。因为,我知道这不是一个好的解决方案,我仍然在寻找正确的解决方案。我不知道是谁提出的。但可能会喜欢听更好的解决方案。因为,我知道这不是一个好的解决方案,我仍然在寻找正确的解决方案。