2017-01-03 6 views
1

だから私はこのようになりますFirebaseデータベース持っている:私は唯一のユーザフィールドがのUIDに等しいリストオブジェクトを返すようにしようとしていますFirebase:)(プッシュで作成したデータの一覧を照会

{ 
    "lists" : { 
    "-KZh-vvPcPGVqC22k2Bo" : { 
     "dateCreated" : "2016-12-23", 
     "listDescription" : "My Christmas Wish List for 2016", 
     "listTitle" : "William's Christmas List", 
     "user" : "ztGAx7eplGeZgdjqnegrtbfuyUy2" 
    } 
    }, 
    "users" : { 
    "8pJJuscerZRGdwGGImnWlCKSEed2" : { 
     "email" : "[email protected]", 
     "name" : "Alyson" 
    }, 
    "ztGAx7eplGeZgdjqnegrtbfuyUy2" : { 
     "email" : "[email protected]", 
     "name" : "William" 
    } 
    } 
} 

をログインしたユーザー。こうして、ログインしたユーザーはすべてのリストを取得します。しかし、ユーザーが新しいリストオブジェクトを作成するたびに、リストに追加するために使用するpush()によって生成された一意のキーのため、リスト内のデータを照会するのに問題があります。リストを照会して、サインインしたユーザーのUIDと一致するリストのみを取得するにはどうすればよいですか?私は

//firebase 
    private FirebaseAuth mAuth; 
    private FirebaseUser mCurrentUser; 
    private String userId = null; 

秒 "users"

最初にあなたのJSONツリーに提供されたパラメータのいずれかにユーザーIDを比較するスニペット、この今のところここ

package com.fanciestw.listpro; 

import android.content.DialogInterface; 
import android.content.Intent; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.InputType; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.database.ChildEventListener; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.Query; 

public class allList extends AppCompatActivity { 

    private FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
    private FirebaseAuth.AuthStateListener mAuthStateListener; 
    private FirebaseDatabase mDatabase = FirebaseDatabase.getInstance(); 
    private DatabaseReference mList = mDatabase.getReference().child("lists"); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_all_list); 
     mAuthStateListener = new FirebaseAuth.AuthStateListener(){ 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth){ 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if(user != null) { 
        Log.d("User Activity", "User Signed In"); 
       } else { 
        Log.d("User Activity", "User Signed Out"); 
        signout(getCurrentFocus()); 
       } 
      } 
     }; 
     mList.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       List newList = dataSnapshot.getValue(List.class); 
       Log.d("List Returned", newList.listTitle + " " + newList.listDescription); 
       updateList(); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 
      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 
       updateList(); 
      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

    @Override 
    public void onStart(){ 
     super.onStart(); 
     Log.d("allList Activity", "onStart"); 
     mAuth.addAuthStateListener(mAuthStateListener); 
    } 

    @Override 
    public void onStop(){ 
     super.onStop(); 
     Log.d("allList Activity", "onStop"); 
     if(mAuthStateListener != null) mAuth.removeAuthStateListener(mAuthStateListener); 
    } 

    public void addNewList(View view){ 
     final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("Add New List"); 

     LayoutInflater inflater = this.getLayoutInflater(); 
     final View dialogView = inflater.inflate(R.layout.add_new_list_form, null); 

     // Inflate and set the layout for the dialog 
     // Pass null as the parent view because its going in the dialog layout 
     builder.setView(dialogView); 

     // Set up the buttons 
     builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       String title = ((EditText)dialogView.findViewById(R.id.add_list_title)).getText().toString(); 
       String desc = ((EditText)dialogView.findViewById(R.id.add_list_desc)).getText().toString(); 

       Log.d("New List Details", title + ", " + desc); 
       //TODO::Store created list with title and desc in database 
       List newList = new List(title, desc, mAuth.getCurrentUser().getUid()); 
       String newListID = mList.push().getKey(); 
       mList.child(newListID).setValue(newList); 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     builder.show(); 
    } 

    public void updateList(){ 
     //Want to get lists where lists.user == firebaseAuth.getCurrentUser().UID(); 
    } 

    public void signout(View view){ 
     mAuth.signOut(); 
     Intent intent = new Intent(this, login.class); 
     startActivity(intent); 
    } 
} 
+2

(HTTP [あなたが立ち往生している問題を再現する最小限のコード]を共有してください

 String UIDstring = (String) dataSnapshot.child("users").getValue(); 

を初期化します/stackoverflow.com/help/mcve)。 [Firebaseデータベースコンソール](https://console.firebase.google.com/project/)の[JSONエクスポート]リンクをクリックすると、JSONツリーの画像を実際のJSONのテキストに置き換えることができます。 /データベース/データ/)。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

+0

「リスト」テーブルをユーザーID(各リストがユーザーに固有のもの)で検索する場合は、クエリ機能を向上させるためにテーブルを再構成することをお勧めします。 tryは、各リストのキーとして 'user-id'を使用してみてください。こうすることで、Firebaseのクエリコマンド 'equalTo'を使って高速クエリを作成することができます。 [NoSQLデータモデリング](https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/)を参照してください。 – phoenix

答えて

2

でいる

//firebase init 
    mAuth = FirebaseAuth.getInstance(); 
    mCurrentUser = mAuth.getCurrentUser(); 
    userId = mCurrentUser.getUid().toString(); 
/:

今、あなたのデータベースのイベントリスナー内では、最終的に

+0

ありがとうございましたdataSnapshotを完全に見ました。 –

関連する問題