2013-02-19 121 views
108

我試圖創建一個應用程序,可以在特定用戶帳戶中獲取/設置數據,並且我被Firebase誘惑。通過使用Firebase的名稱屬性獲取用戶

我遇到的問題是,我不知道如何針對特定用戶的數據時,我的結構是這樣的:

My data structure described by the text below.

online-b-cards 
    - users 
    - InnROTBVv6FznK81k3m 
     - email: "[email protected]" 
     - main: "Hello world this is a text" 
     - name: "Alex" 
     - phone: 12912912 

我環顧四周,我可以如果沒有任何關於如何訪問個人數據的信息,更不用說當他們將一些隨機散列作爲他們的ID時。

我將如何去基於他們的名字獲取個人用戶信息?如果有更好的方法,請告訴我!

+0

試試這個:http://stackoverflow.com/questions/32886546/how-to-get-all-child-list-from-firebase-android/36600791#36600791 – 2016-04-17 20:54:46

回答

133

此前,火力地堡需要你生成自己的索引下載在一個位置的所有數據,以查找和檢索匹配一些子屬性的元素(例如,所有用戶name === "Alex")。

2014年10月,Firebase通過orderByChild()方法推出了新的查詢功能,使您能夠快速高效地完成此類查詢。請參閱下面的更新答案。


向Firebase寫入數據時,有幾個不同的選項會反映不同的用例。在高層次,火力地堡是一個樹形結構的NoSQL數據存儲庫,並提供了一些簡單的圖元用於管理數據的列表:

ref.child('users').child('123').set({ "first_name": "rob", "age": 28 }) 

  1. 了一個獨特的,已知的關鍵火力點

  2. 追加到將自動按時間排序寫有一個自動生成的密鑰列表:

    ref.child('users').push({ "first_name": "rob", "age": 28 }) 
    
  3. 用於通過其獨特的,已知路徑中數據的變化:

    ref.child('users').child('123').on('value', function(snapshot) { ... }) 
    
  4. 過濾順序在列表數據由屬性值

    // Get the last 10 users, ordered by key 
    ref.child('users').orderByKey().limitToLast(10).on('child_added', ...) 
    
    // Get all users whose age is >= 25 
    ref.child('users').orderByChild('age').startAt(25).on('child_added', ...) 
    

With t他增加了orderByChild(),你不再需要爲子屬性查詢創建自己的索引!例如,檢索所有用戶名爲「亞歷克斯」:在火力地堡

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added', ...) 

工程師在這裏。在將數據寫入Firebase時,您有幾個不同的選項可以反映不同的應用程序使用情況。由於Firebase是NoSQL數據存儲區,因此您需要使用唯一鍵存儲數據對象,以便您可以直接訪問該項目,或者在特定位置加載所有數據並遍歷每個項目以查找您正在查找的節點對於。有關更多信息,請參閱Writing DataManaging Lists

當您在火力地堡寫數據時,您可以使用一個獨特的,定義的路徑(即a/b/c),或push數據到一個列表,它會生成一個唯一的ID(即a/b/<unique-id>),並允許你進行排序set數據和按時間查詢該列表中的項目。您在上面看到的唯一ID是通過調用push將一個項目追加到列表online-b-cards/users生成的。

而不是在這裏使用push,我建議使用set,並使用唯一密鑰(例如用戶的電子郵件地址)存儲每個用戶的數據。然後,您可以通過Firebase JS SDK導航至online-b-cards/users/<email>直接訪問用戶的數據。例如:

function escapeEmailAddress(email) { 
    if (!email) return false 

    // Replace '.' (not allowed in a Firebase key) with ',' (not allowed in an email address) 
    email = email.toLowerCase(); 
    email = email.replace(/\./g, ','); 
    return email; 
} 

var usersRef = new Firebase('https://online-b-cards.firebaseio.com/users'); 
var myUser = usersRef.child(escapeEmailAddress('[email protected]')) 
myUser.set({ email: '[email protected]', name: 'Alex', phone: 12912912 }); 

注意,由於火力地堡不引用允許某些字符(見Creating References),我們刪除了.,並在上面的代碼中,替換它。

+2

完美!感謝Rob的迴應。愛火爐堡! – 2013-02-19 18:59:08

+0

我沒有得到的是,當你做一個查詢,你得到一個對象的id作爲一個屬性,在這種情況下,逃生電子郵件,值是您設置的對象。當然,如果你閱讀一個列表,你不知道這個ID,那麼......你應該怎樣讀取數據? – Sam 2014-03-31 07:42:25

+0

@Sam我不完全理解你的問題,但如果用一些示例代碼提出一個單獨的問題並解釋你的用例,我很樂意提供幫助。 – 2014-03-31 14:37:20

2

這是一篇文章,幫助我嘗試訪問自動生成的唯一ID的帖子。 Access Firebase unique ids within ng-repeat using angularFire implicit sync

謝謝,bennlich(源):

火力地堡如同普通javascript對象。也許下面的例子可以讓你走上正軌。

<div ng-repeat="(name, user) in users"> 
    <a href="" ng-href="#/{{name}}">{{user.main}}</a> 
</div> 

編輯:不能100%確定你想要的結果,但這裏的多一點,可能引發一個「啊哈」的時刻。在您的Firebase儀表板中點擊您正嘗試訪問的密鑰。從那裏你可以使用類似的東西:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name); 
    ref.once('value', function(snapshot) { 
     $scope.variable= snapshot.val(); 
}); 
+0

你好安東尼,感謝你提供了REST結構(?)的信息,它絕對是一個'aha'。回顧這篇文章,現在我清楚地意識到,我已經以一種尷尬的方式構建了我的數據,感謝這些提示,並且我會記住我的下一個基於Firebase的項目! – 2016-01-05 23:54:36

4

我認爲最好的方法是基於Firebase提供的auth對象來定義用戶的id。當我創建我的用戶,我做的:

FirebaseRef.child('users').child(id).set(userData); 

這個id來自:

var ref = new Firebase(FIREBASE); 
var auth = $firebaseAuth(ref); 
auth.$authWithOAuthPopup("facebook", {scope: permissions}).then(function(authData) { 
    var userData = {}; //something that also comes from authData 
    Auth.register(authData.uid, userData); 
}, function(error) { 
    alert(error); 
}); 

的火力地堡身份驗證服務將始終確保所有的供應商在UID被設置中一個唯一的ID。這樣,總是在你將有auth.uid並且可以輕鬆地訪問所需的用戶進行更新,如:

FirebaseRef.child('users').child(id).child('name').set('Jon Snow'); 
4

您可以通過下面的代碼抓住細節。

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference myRef = database.getReference("users"); 
myRef.orderByChild("name").equalTo("Alex").addListenerForSingleValueEvent(new ValueEventListener() {   
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) { 
         Log.d(TAG, "PARENT: "+ childDataSnapshot.getKey()); 
         Log.d(TAG,""+ childDataSnapshot.child("name").getValue()); 
        } 
1

這是如何訪問自動生成火力地堡唯一鍵: 數據結構: - OnlineBcards - 唯一鍵

database.ref().on("value", function(snapshot) { 
     // storing the snapshot.val() in a variable for convenience 
     var sv = snapshot.val(); 
     console.log("sv " + sv); //returns [obj obj] 

     // Getting an array of each key in the snapshot object 
     var svArr = Object.keys(sv); 
     console.log("svArr " + svArr); // [key1, key2, ..., keyn] 
     // Console.log name of first key 
     console.log(svArr[0].name); 
}, function(errorObject) { 
    console.log("Errors handled: " + errorObject.code); 
}); 
0

添加唯一的ID UR最簡單和更好的方法數據庫根據認證用戶是這樣的:

private FirebaseAuth auth; 

String UId=auth.getCurrentUser().getUid(); 

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference myRef = database.getReference("Users"); 

User user = new User(name,email,phone,address,dob,bloodgroup); 

myRef.child(UId).setValue(user); 

該UID將是一個唯一的ID爲特定的認證電子郵件/用戶

+3

這並沒有解決問題。問題是如何獲取和設置特定用戶帳戶中的數據。由於* user *不是有效的參數,因此您的代碼會創建一個用戶帳戶並且實際上無效,因爲您無法.setValue(用戶)。 – Jay 2017-03-31 19:35:38

0

最簡單的方法是停止使用.push(){}

功能,這將產生隨機密鑰。但改爲使用.update(){}函數,您可以指定孩子的名稱而不是隨機密鑰。

相關問題