【问题标题】:Android - Firebase DatabaseAndroid - Firebase 数据库
【发布时间】:2018-09-17 18:34:31
【问题描述】:

我的应用程序是令牌生成移动应用程序。我正在使用 Firebase 存储我的数据。令牌是在 firebase 数据库中的儿童计数的帮助下生成的。我面临的问题是,如果两个用户同时预约,那么两个用户都会获得相同的令牌号码。例如,firebase 中的孩子数为 5。如果用户 A 和 B 预订了他们的约会,那么两个用户都获得了 6 号令牌。但是另一个用户 C 预订了约会(在 A 和 B 之后)获得了正确的令牌号8.

我的代码:

int ct=1;

public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
        ++ct;
        Log.d("log", "onDataChange: " + dataSnapshot1.child("Appointment").child("artistName").getValue());
    }
}

变量ct代表令牌号。

解决上述问题的方法是什么?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    不应根据节点下的子节点数生成令牌。它不会用于在您的数据库中唯一地识别令牌。

    据我了解您的问题,您希望向您的应用程序的用户提供一个令牌,以便自动预约一些艺术家。在这种情况下,我建议您在 Firebase 数据库中使用另一个表来存储所有令牌。将令牌编号与艺术家一起标记。

    所以最终的表结构将是这样的。

    Appointment
        -- Artists
               -- TokenNumber
    
    Token 
        --TokenNumber
    

    如果您熟悉关系数据库,您可能会考虑将您的令牌编号视为另一个表的外键,每次将令牌分配给某个约会时,它都会自动递增。

    希望有帮助!

    更新

    根据评论,我找到了a nice answer in stackoverflow 与此有关。请查看有关如何在 Firebase 中增加值的答案。关键思想是使用事务模式从客户端设置值。我正在分享所引用答案中的示例代码。

    public void incrementCounter() {
        firebase.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(final MutableData currentData) {
                if (currentData.getValue() == null) {
                    currentData.setValue(1);
                } else {
                    currentData.setValue((Long) currentData.getValue() + 1);
                }
    
                return Transaction.success(currentData);
            }
    
            @Override
            public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
                if (firebaseError != null) {
                    Log.d("Firebase counter increment failed.");
                } else {
                    Log.d("Firebase counter increment succeeded.");
                }
            }
        });
    }
    

    【讨论】:

    • 如何自动增加令牌? @ReazMurshed
    • 其实我已经尝试过更新的代码。但这似乎是错误的。我将再次尝试更新的代码。
    • 我认为上面的代码可以增加单个 firebase 计数器的值。但我想要每个注册患者的计数器变量。
    • 将令牌编号视为不同表中的外键。实际上就是这样。
    • 我不想要单个值。不同用户的token number值不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多