当前位置: 首页 > 面试题库 >

在Firebase中自动增加值

夏侯宏旷
2023-03-14
问题内容

如何从Android客户端自动递增存储在Firebase中的值?

当前:我声明int id = 1。当我增加时,我看到值2、3等被存储。很好,但是当我重新运行项目时,id再次设置为等于1。

我希望它的行为像静态变量一样,因此我可以创建一个从1到无穷大的id,而无需重置。

更新失败

我使用以下代码将Firebase参考和一个字符串传递给函数incrementCounter。

if(language_chosen.equalsIgnoreCase("english"))
 {
   Firebase publRef = f.child("Language").child("English").child("Message");
   Firebase newPublRef = publRef.push();
   writeMsgActivity demo = new writeMsgActivity();
   demo.incrementCounter(newPublRef,the_msg_enter);                                 
  }

现在,我尝试public void incrementCounter(Firebase publref,String my_msg)在oncomplete方法中使用传递的引用和字符串, 但这给我一个错误。

   public void incrementCounter(Firebase publref,String my_msg) {
    publref.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);
        }

        public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
            if (firebaseError != null) {
                System.out.println("Firebase counter increment failed.");
            } else {
                System.out.println("Firebase counter increment succeeded.");

                Map<String, Object> publ = new HashMap<String, Object>();
                publ.put("pubMsg", my_msg);
                publ.put("id",currentData);
                publref.setValue(publ);
            }
        }
    });
}

已解决的更新

                final Firebase upvoteref = new Firebase("https://shareurday.firebaseio.com/Message/"+msg_id+"/upvotes");

            upvoteref.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);
                }

                public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
                    if (firebaseError != null) {
                        System.out.println("Firebase counter increment failed.");
                    } else {
                        System.out.println("Firebase counter increment succeeded.");
                    }
                }
            });

变量msg_id是从push随机生成的id。


问题答案:

这是一个增加单个计数器的示例方法。关键思想是您要么创建条目(将其设置为等于1),要么对现有条目进行 突变
。在此处使用事务可确保如果多个客户端尝试同时增加计数器,则所有请求最终都将成功。从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.");
            }
        }
    });
}


 类似资料:
  • 你好,我正在做一些firebase项目,我可以通过javascript保存我的数据到firebase数据库。但是我不能自动增加我的数据库的子值(我的子值是duyuru,你可以在下面看到详细信息)。我在下面分享我的代码,你能给我解决这个问题的提示吗。 外面是这样的 我想输出数据像; duyuru(子值)部分应该是自动增量,这是我想要的。谢谢你的回答

  • 你们能帮帮我吗,我的主键无法自动递增,我的表名是books,我想自动递增的列是serial_no,这是主键。 这是五月按钮,当我输入所有数据时,它将被提交到我的台本上 顺便说一句,我找到了另一种方法,抓取我的表并重建它,然后将代码放入create table脚本中 SERIAL_NOINTEGER默认AUTOINCREment:开始1增量1不是空主键

  • 我想用自动增量id向firebase数据库添加一个新用户,如下截图所示: 我试过:

  • 问题内容: 如何在MySQL的select语句中创建并自动增加临时列? 这是我到目前为止的内容: 哪个返回: 但是我需要: 问题答案: 这将为您提供一个 连续的 行号。 结果

  • 问题内容: 在MySQL中,是否可以在自动递增前面附加一个字母。我的数据库中有几个表,其中一些表具有通过自动增量创建的唯一ID。我希望能够通过前面的字母来区分自动生成的数字。 这不是绝对必需的功能,但只会帮助简化小型任务。 问题答案: 不幸的是你不能那样做。至少不是在sql中。自动增量字段是整数类型,因此在其中添加字母会违反约束。 我希望这可以引导您朝正确的方向发展。