2016-05-12 24 views
2

今天我遇到了火力地堡的問題進行查詢,如:「給我具有特定UID的用戶的所有項目(用戶的唯一id)「的Android - 火力地堡複雜(或不)查詢 - 問題與唯一ID

使用推送方法添加的項目是,它創建了唯一ID。有沒有辦法繞過這種請求的唯一ID?

任何幫助將higly讚賞。

非常感謝提前,

火力地堡結構: current firebase structure

當前代碼:

//New firebase instance 
Firebase mFirebase = new Firebase(Constants.FIREBASE_ITEMS_URL); 

//Query on records to find items related to users only 
mQuery = mFirebase.child(uid).orderByChild(uid).equalTo(uid); 

     mQuery.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       getUpdates(dataSnapshot); 
      } 

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

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

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

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
       Log.i(LOG_TAG, String.valueOf(firebaseError)); 
      } 
     }); 
+0

我不知道如何制定查詢,以便它返回具有定義的用戶界面的所有項目的用戶。我不知道如何到達uid領域。到目前爲止,我有這個:mQuery = mFirebase.child(「items」)。orderByChild(「uid」)。equalTo(uid);但它返回一個有意義的錯誤。 您是否有任何線索可以提出請求?非常感謝, – Isabelle

+1

您正在像處理關係數據庫一樣對待firebase,您可以在其上執行查詢,您需要將所有數據展平,這可能會導致數據重複,但是您在重複數據中所佔的比例會減少查詢速度 - 請參閱我的答案,如果這無助於隨意問更多 – Grant

+0

我正在研究一下找出制定查詢的方式,看起來像這樣:mQuery = mFirebase.child(「items」) .child(generatedID).child(UID); 我絕對不知道如何告訴Firebase我的孩子是生成的唯一ID。我會完全理解你的問題「我不明白你的問題」) – Isabelle

回答

2

我可以看到完成的最佳方式「給我所有具有該特定UID(用戶唯一ID)「的用戶的項目將被修改Y在您的用戶火力結構,所以它的如下:

{ 
    users: { 
    user1: { 
     user_details { //whatever you need in here// } 
     items: { 
     -KHZlfskXT_aQtVOZytd: true, 
     item1: true, 
     item2: true, 
     item3: true 
     } 
    } 
    } 
} 

然後,您可以查詢針對這一點,讓所有的itemIds的列表爲每個用戶,那麼你可以使用itemIds的該列表來檢索對應的項目 - 爲了使這種佈局的要求:(我已經在JavaScript寫它)

var userItemsRef = mFirebase.child('users').child(uid).child('items') 
var itemsRef = mFirebase.child('items'); 

userItemsRef.on('child_added', function(dataSnap) { 
    itemsRef.child(dataSnap.key()).once('value', function(snap) { 
    // do whatever you need to with the item 
    }); 
}); 

對於未來的這種類型的東西閱讀,看看this article on denormalising your data in firebase

+0

Thanks Grant,我需要進一步調查;對我來說理解字段/值的目的有點困難:someItemId:true和nextItemId:true;你不會爲像「user1」這樣的節點生成唯一標識符ID?非常感謝, – Isabelle

+1

由firebase創建的push標識符是一個唯一標識符,當我編寫諸如someItemId,nextItemId之類的東西時,它們是出現在那裏的推入ID的佔位符,即它們是item1,item2,item3 - 我建議你繼續使用Firebase推ids,因爲它們不僅僅是唯一的,它們也可以作爲一種時間戳的形式,由於它們生成的方式 – Grant

+0

我會盡量直接使用 – Isabelle

1

我與格蘭特很肯定,它可能會更好存儲每個用戶的項目。

但就我所看到的,你也應該能拿到的項目在目前的結構:與火力地堡排序的「跳級」

String uid = "bd4dd...a670"; 
Firebase firebase = new Firebase("https://<app-name>.firebaseio.com"); 
Query query = firebase.child("items").orderByChild("uid").equalTo(uid); 

查詢。所以上面說:按照uid的順序排列所有項目,然後給我指定用戶的項目。

+0

謝謝弗蘭克的回答。我想我會更新我的Firebase結構。我會嘗試你的代碼,所以我可以讓它「工作」,但肯定會更新我的結構,因爲它還不算太晚。 – Isabelle

+0

所以我一次又一次地嘗試,並且一直有着同樣的錯誤。 據說: uid:沒有這樣的實例字段:'uid'和mQuery相同。 因爲我的路徑是/ items/generated_id/uid,所以我真的不知道要放什麼。您的幫助將不勝感激。 – Isabelle

+0

'equalTo(uid)'是你放置你想要選擇項目的用戶的uid的位置。這個和'mQuery'都來自您的原始代碼。您可以使用'Query mQuery'將後者聲明爲局部變量。 –

0
FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
    //getting the current user id 
    String uid = mAuth.getCurrentUser().getUid(); 
    DatabaseReference dbroot = FirebaseDatabase.getInstance().getReference().getRoot(); 
    DatabaseReference items = dbroot.child("items"); 
    //firebase query 
    Query q = items.orderByChild("uid").equalTo(uid); 
+1

請求您爲共享的代碼添加一些上下文/評論。它會幫助提問者和其他讀者更好地理解你的帖子。 – RBT

+0

是的,當然可以。實際上,在這裏新的它需要一段時間才能理解所有這些工作,但感謝您的建議先生:D –