Firebase equalTo不起作用,尝试获取所有数据

时间:2016-12-01 14:52:41

标签: java android firebase filter firebase-realtime-database

首先,我知道这是常见的问题,但我现在真的很分心,不能真正得到我必须做的事情,更改架构(这将花费太长时间)或者我的代码中有一些错误,这是Firebase节点的架构,例如:enter image description here

以下是我尝试查询该数据的方法:

firebaseDatabase = FirebaseDatabase.getInstance().getReference()
                        .child("Statistic");

        final Query query = firebaseDatabase
                .orderByChild("Programa")
                .equalTo("0010104")
                .limitToFirst(10);


        query.addValueEventListener(new ValueEventListener()
        {
            public void onDataChange(DataSnapshot dataSnapshot)
            {
               for(DataSnapshot s : dataSnapshot.getChildren())
               {
                   Statistic statistic = s.getValue(Statistic.class);
                   Log.d("Found : ",statistic.getFakulteti());
               }
            }

            public void onCancelled(DatabaseError databaseError)
            {
                DialogFactory.errorPrompt(activity).show();
            }
        });

但是查询不起作用,在等待一两分钟后,它会尝试从Firebase获取所有数据,这当然会导致outOfmemory异常。

错误日志:

Firebase Database encountered an OutOfMemoryError. You may need to reduce the amount of data you are syncing to the client (e.g. by using queries or syncing a deeper path). See https://firebase.google.com/docs/database/ios/structure-data#best_practices_for_data_structure and https://firebase.google.com/docs/database/android/retrieve-data#filtering_data
                                                                        java.lang.OutOfMemoryError: Failed to allocate a 27113000 byte allocation with 16777216 free bytes and 24MB until OOM
                                                                            at java.lang.StringBuilder.toString(StringBuilder.java:408)
                                                                            at com.google.android.gms.internal.zzaje.toString(Unknown Source)
                                                                            at com.google.android.gms.internal.zzajc.zzsm(Unknown Source)
                                                                            at com.google.android.gms.internal.zzajc.zzso(Unknown Source)
                                                                            at com.google.android.gms.internal.zzajc.zza(Unknown Source)
                                                                            at com.google.android.gms.internal.zzajc$zzc$2.run(Unknown Source)
                                                                            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
                                                                            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
                                                                            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)

我试过的规则:

{
  "rules": {
    ".read": true,
    ".write": false,
      ".indexOn" : ["Programa"]
  }
}

1 个答案:

答案 0 :(得分:0)

在你的问题中我可以看到多个内容...... 第一个是,你的programa键是一个String,如果不存在,则字符串值等于"0010104",不要找到任何东西,如果我们说存在,那么你会得到十个第一个。这种情况可能吗?如果您想要在部分"0010104"中包含字符串键,则需要使用startAt()endAt()代替equalsTo()

第二个是,有多少个节点包含Statistic节点?如果您的答案是一百或更少(例如),那么我们不能做任何事情,但如果你的答案是无限那么就是firebase的典型案例,规范化firebase数据库,怎么做?阅读我昨天回答的有关此主题的post

如果我帮助了你并且编程很好,请告诉我!