【问题标题】:Firebase DB copying data one node to anotherFirebase DB 将数据从一个节点复制到另一个节点
【发布时间】:2017-05-04 09:52:44
【问题描述】:

我正在尝试将数据从我的数据库中的一个节点 (groups/groupId/matches) 添加到另一个节点 (users/userId/groups)

这个方法执行一次很完美,但是如果我第二次尝试执行我遇到麻烦,得到这个错误

com.google.firebase.database.DatabaseException: 
Failed to convert value of type java.lang.String to boolean

从使用 Firebase 开始,我不明白 SetValue 您应该覆盖任何现有数据,我在我的应用程序中看到了这一点

只是不确定我的下一步行动,非常感谢任何帮助。

方法调用

  moveFirebaseRecord(groupsDatabase.child(firebaseUser.getUid()).child("matches"),
                            usersDatabase.child(uId).child("groups"));

方法

    public void moveFirebaseRecord(DatabaseReference fromPath, final DatabaseReference toPath) {
    fromPath.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            toPath.setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                    if (databaseError != null) {
                        Toast.makeText(getApplicationContext(), "COPY FAILED", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(getApplicationContext(), "COPY SUCCESS", Toast.LENGTH_LONG).show();

                    }
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(), "onCancelled- copy fail", Toast.LENGTH_LONG).show();

        }
    });
}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    “此方法完美执行一次...”是addListenerForSingleValueEvent 的预期行为。来自文档:

    为此位置的数据中的单个更改添加侦听器。此侦听器将使用该位置的数据值触发一次。

    addValueEventListener 听起来更适合这种情况。

    如果您总是需要将从groups/groupId/matches 写入的数据复制到users/userId/groups,则最好使用Firebase Cloud Function with a Realtime Database trigger

    【讨论】:

    • 感谢您的回复 Jeff,我尝试使用 addValueEventListener 并出现同样的错误。我会看看云函数来解决这个问题,我们的云函数是否建议检查数据是否存在于节点中,如果不复制它?
    • 是的,云功能在这里听起来是个不错的解决方案。您的应用程序中的com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.String to boolean 来自哪里?是哪条线路造成的?
    • 我不确定是哪一行导致它或者为什么它第一次工作而不是在随后的尝试之后(即使我使用 addValueEventListener )我的 Match 类中有 2 个布尔值会得到复制过来。所以也许这是导致问题的原因之一。当我尝试将我的方法中的值记录到控制台时不是很清楚
    • 从记录到控制台实际上看起来该方法根本没有启动,因为控制台中没有记录任何内容
    • 您的值是否确定保存为布尔值?也许它们被保存为字符串,而任何消耗这些数据的东西都需要一个布尔值。
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2023-02-18
    • 2017-05-15
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多