首先,我知道这是常见的问题,但我现在真的很分心,不能真正得到我必须做的事情,更改架构(这将花费太长时间)或者我的代码中有一些错误,这是Firebase节点的架构,例如:
以下是我尝试查询该数据的方法:
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"]
}
}
答案 0 :(得分:0)
在你的问题中我可以看到多个内容...... 第一个是,你的programa键是一个String,如果不存在,则字符串值等于"0010104"
,不要找到任何东西,如果我们说存在,那么你会得到十个第一个。这种情况可能吗?如果您想要在部分"0010104"
中包含字符串键,则需要使用startAt()
或endAt()
代替equalsTo()
。
第二个是,有多少个节点包含Statistic节点?如果您的答案是一百或更少(例如),那么我们不能做任何事情,但如果你的答案是无限那么就是firebase的典型案例,规范化firebase数据库,怎么做?阅读我昨天回答的有关此主题的post。
如果我帮助了你并且编程很好,请告诉我!