Firebase Android:当我的数据库增长时出现问题

Posted

技术标签:

【中文标题】Firebase Android:当我的数据库增长时出现问题【英文标题】:Firebase Android: Having issues when my database grows 【发布时间】:2020-04-06 09:27:37 【问题描述】:

在测试期间,我的数据库中有大约 30 个报价和大约 6 个用户。

我现在添加了我的报价。

总计约2000:

问题: 应用程序加载需要很长时间,它崩溃并进入页面等待应用程序或退出。然后我减少到 200 条报价,但仍有问题(可能会在崩溃前显示一条报价)

我在做什么? 我在我的数据库中引用我的报价,每次有人打开主页时都会得到一个随机报价(不知道如何每天得到一个报价)

引号的 JSON 片段:

    
   "Quotes": 
       "1": 
          "Name": "Abbey, Edward",
          "Quote": "In social institutions, the whole is always less than the sum of its parts. There will never be a state as good as its people, or a church worthy of its congregation, or a university equal to its faculty and students."
       ,
       "2": 
          "Name": "Adams, George Matthew",
          "Quote": "There is no such thing as a self-made man. We are made up of thousands of others. Everyone who has ever done a kind deed for us, or spoken one word of encouragement to us, has entered into the makeup of our character and our thoughts, as well as our success."
       ,
       "3": 
          "Name": "Albani, Emma",
          "Quote": "I had always loved beautiful and artistic things, though before leav"
       ,
       "4": 
          "Name": "Borman, Frank",
          "Quote": "Exploration is really the essence of the human spirit."
       ,

........等等

我的代码:

private void showQuote()

    databaseReference = FirebaseDatabase.getInstance().getReference("Quotes");
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
            int count = (int) dataSnapshot.getChildrenCount();
            for(DataSnapshot data: dataSnapshot.getChildren())
                int rand = new Random().nextInt(count);
                for (int i = 0; i < rand; i++) 
                    String authorName = data.child("Name").getValue().toString();
                    String quoteGiven = data.child("Quote").getValue().toString();
                    name.setText("- " + authorName);
                    quote.setText(quoteGiven);
                
            
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 
            Toast.makeText(MainActivity.this, "Loading Quote failed", Toast.LENGTH_SHORT).show();
        
    );


我的规则:

 
  "rules": 
    "users": 
      "$uid": 
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
       
      ,
      "Quotes": 
       ".read": true,
        ".write": false
    
  

我要的是什么?

我希望能够每天显示报价,如果无法随机显示报价。如果我继续随机给出报价,我能做些什么来确保它不会使应用程序超载并使其崩溃。我想要很多引用而不是经常删除和添加新引用。

【问题讨论】:

这能回答你的问题吗? Select random entry from Firebase Realtime Database in Java 【参考方案1】:

1.“应用加载需要很长时间”

你有databaseRef.keepSynced(true);吗?

这将加载所有数据库,因此需要很长时间

你应该只阅读你想要的东西

或者你可以FirebaseDatabase.getInstance().setPersistenceEnabled(Base.dataPersistence);

它会保留数据而不需要长时间重复读取

2.你应该检查你的数据库,如果格式错误那么它会死

3.我有最简单的方法,你只需在你的firebase数据库根目录中记录大小,

只需读取size,生成随机int即可得到报价,或者先做一个随机数公式,可以轻松指定报价,无需全部下载。

【讨论】:

以上是关于Firebase Android:当我的数据库增长时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 和 Firebase - 如何确定每周增长

Android - 从 Firebase 数据库中删除“活动”标记

Android中的Firebase数据描述排序

Android Firebase 数据库已损坏

Android,从 firebase 数据库中获取价值

当我在 Android 中将文件上传到 Firebase 存储时,进度条没有更新