2017-08-31 22 views
0

ユーザが他のユーザを検索して友人として追加できるようにしたいと考えています。 私はFirebaseデータベースに約6,000のユーザノードを持っているので、明らかにそれを検索するのはかなり重い作業です。 私は私の「ユーザー」ノード、ルートディレクトリに「friendsIndex」と呼ばれ、検索のために必要な最小限の情報でそれを埋めから別のノードを作成しました:FirebaseデータベースOutOfMemoryError - 大きな検索操作

:私のデータベースルールがこれを持っている

friendsIndex: { 
    $userID: { 
    name: "firstName", 
    lastName: "lastName", 
    profileImg: "urltoImage..." 
    }, 
    .... 
} 

"friendsIndex":{ 
    "$userID":{ 
    ".indexOn": ["name", "lastName"] 
    } 
}, 

ユーザー検索機能は、次のようになります。

Query mQuery = Database.child("friendsIndex").orderByChild("name").startAt(searchWord).endAt(searchWord+"\uf8ff"); 
mQuery.addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          User user; 
          for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) { 
           user = eventSnapshot.getValue(User.class); 
           //more code.. 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

しかし、私はまだ、このエラーを取得しています:

08-31 13:03:28.354 3916-3925/com.learnArabic.anaAref E/System: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available 
08-31 13:03:28.364 3916-17998/com.learnArabic.anaAref E/RunLoop: 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: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available 
08-31 13:03:28.379 3916-3916/com.learnArabic.anaAref E/UncaughtException: java.lang.RuntimeException: 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 
                       at com.google.android.gms.internal.mz.run(Unknown Source) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6247) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 
                      Caused by: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available 

この検索を実行する重大な方法はありません。

+0

エラーメッセージには、携帯電話のメモリよりも多くのデータを取得していると表示されているためです。クエリのデータ量はどれくらいですか? –

答えて

1

例外はヒントですが間違ったURLを示しています。フィルタリングの正しいURLはhttps://firebase.google.com/docs/database/android/lists-of-data#filtering_dataです。このページから、メソッドlimitToFirst()を使用して、リストの開始からの結果の数を制限することができます。私はあなたの質問に答えます:

Can't think of any less heavy way to perform this search, any ideas?

他の方法を使って、2つのクエリ間でユーザーが削除されたときの状況を処理できます。たとえば、orderByKey()、次に2番目のクエリではstartAt(lastKey)を使用します。

関連する問題