【问题标题】:how do i auto increment a value in firebase我如何在firebase中自动增加一个值
【发布时间】:2017-06-09 20:07:56
【问题描述】:

我目前正在开发一个应用程序,该应用程序使用 firebase 存储和 firebase 数据库下载文件以存储链接到存储的 url。 fire base 数据库树看起来有点像这样

应用程序 | 应用程序1 | 命名我的应用下载 1 网址http://link下载 关于您下载的应用程序 您下载的应用的图片图片网址 下载 = 0 | 应用程序2 (数据同上)

我有自定义的基本适配器,它允许我添加图像 url 和关于值。 当有人点击我列表中的项目时,它会下载并安装您选择的应用程序,方法是获取项目的位置,然后使用 httpget 从数据库中获取 url。

id 喜欢的是当他们点击项目时,它会自动将孩子下载的内容加 1,因此它充当下载计数器。

 mrootRef = new Firebase("https://admob-app-id-3020090926.firebaseio.com/Apps");
    mlv = (ListView) findViewById(R.id.lvFilmapps);
    mrootRef.child("Filmapps").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            final String appname = dataSnapshot.child("name").getValue(String.class);
            final String url = dataSnapshot.child("url").getValue(String.class);
            final String apkname = dataSnapshot.child("apk").getValue(String.class);
            final String about = dataSnapshot.child("about").getValue(String.class);
            final String appimg = dataSnapshot.child("image").getValue(String.class);


            FilmArray.add(appname);
            urlList.add(url);
            ApkList.add(apkname);
            Aboutapp.add(about);
            appImage.add(appimg);

            //String[] convertion  for the BaseAdpater
            String[] arr = FilmArray.toArray(new String[FilmArray.size()]);
            String[] arr1 = Aboutapp.toArray(new String[Aboutapp.size()]);
            String[] arr2 = appImage.toArray(new String[appImage.size()]);

            mlv.setAdapter(new dataListAdapter(arr,arr1,arr2));
            new dataListAdapter(arr,arr1,arr2).notifyDataSetChanged();

            mlv.setOnItemClickListener(new AdapterView.OnItemClickListener() {


                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                     newnamestring = ApkList.get(i).toString();
                    apkNames = FilmArray.get(i).toString();
                    new DownloadFileFromURL().execute(urlList.get(i));
                }
            });
        }

【问题讨论】:

  • 最简单的方法可能是使用 AddListenerForSingleValueEvent 获取当前下载次数,然后添加一个,并使用 setValue() 保存,如果您希望人们同时下载,那么您可能想像@TheSunshinator 在他的回答中提到的那样查看交易。

标签: java android firebase increment


【解决方案1】:

我想你可能想看看Transaction。如果reference 是你的FirebaseReference 指向要递增的数字,你可以这样做:

reference.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        if (mutableData.getValue() == null) {
            mutableData.setValue(1);
        } else {
            int count = mutableData.getValue(Integer.class);
            mutableData.setValue(count + 1);
        }
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean success, DataSnapshot dataSnapshot) {
        // Analyse databaseError for any error during increment
    }
});

注意,两个Transactions 不能同时执行,所以你确定count 更新正确。您可以了解更多详情here

【讨论】:

  • 谢谢我在浏览论坛时看到了这种方法@TheSunshinator 我现在要去看看让你发布也谢谢
  • 感谢@Linxy,是的,我将研究上述方法
  • 我会将 ref 指向哪里?我想如果我将它指向孩子“url”,每次有人点击 url 时它都会计数。它确实如此,但它计算了所有网址。即从每个应用程序下载而不是每个单独的应用程序。我该如何解决这个问题?
  • 如果您的用户已登录,您可以使用他们的 UID 作为节点“url”的子节点,并在那里设置他们的应用程序下载计数(url -> userUid -> count)。然后,上面代码中的reference 将指向 url/
  • 感谢@TheSunshinator 我认为可能与 uid 有关。我在看你昨天发布的消防基地的例子。我想我实际上可能会像他们一样制作一个帖子类,因为我确实使用了与演示中类似的功能,而且我认为它通常会整理我的很多代码。感谢你的帮助。我会发布结果,就好像我设法正确计算它一样。到目前为止,虽然我现在有一个通用下载计数器,但在我的主页上将总下载量计算为统计数据,但从好的方面来说,哈哈
猜你喜欢
  • 2015-05-09
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多