특정 사용자 계정에서 데이터를 가져 오거나 설정할 수있는 애플리케이션을 만들려고하는데 Firebase의 유혹을 받았습니다.
내가 겪고있는 문제는 내 구조가 다음과 같이 보일 때 특정 사용자 데이터를 타겟팅하는 방법을 모른다는 것입니다.
online-b-cards
- users
- InnROTBVv6FznK81k3m
- email: "hello@hello"
- main: "Hello world this is a text"
- name: "Alex"
- phone: 12912912
주위를 둘러 보았으며 ID로 임의의 해시가 주어지면 개별 데이터에 액세스하는 방법에 대해서는 실제로 아무것도 찾을 수 없습니다.
이름을 기준으로 개별 사용자 정보를 가져 오려면 어떻게해야합니까? 더 좋은 방법이 있다면 알려주세요!
답변
이전에는 Firebase에서 자체 속성 을 생성 하거나 특정 위치에서 모든 데이터를 다운로드하여 일부 하위 속성 (예 :의 모든 사용자)과 일치하는 요소를 찾고 검색해야했습니다 name === "Alex"
.
2014 년 10 월 Firebase는이 orderByChild()
방법을 통해 새로운 쿼리 기능을 출시하여 이러한 유형의 쿼리를 빠르고 효율적으로 수행 할 수 있습니다. 아래의 업데이트 된 답변을 참조하십시오.
Firebase에 데이터를 쓸 때 다양한 사용 사례를 반영하는 몇 가지 옵션이 있습니다. Firebase는 기본적으로 트리 구조의 NoSQL 데이터 저장소이며 데이터 목록 관리를위한 몇 가지 간단한 기본 요소를 제공합니다.
-
고유하고 알려진 키를 사용하여 Firebase에 씁니다 .
ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
-
작성된 시간별로 자동 정렬되는 자동 생성 키가있는 목록에 추가 :
ref.child('users').push({ "first_name": "rob", "age": 28 })
-
고유하고 알려진 경로로 데이터의 변경 사항을 청취하십시오 .
ref.child('users').child('123').on('value', function(snapshot) { ... })
-
키 또는 속성 값 으로 목록의 데이터를 필터링 하거나 주문하십시오 .
// 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', ...)
를 추가 orderByChild()
하면 더 이상 하위 속성에 대한 쿼리를위한 고유 인덱스를 만들 필요가 없습니다! 예를 들어, 이름이 “Alex”인 모든 사용자를 검색하려면 다음을 수행하십시오.
ref.child('users').orderByChild('name').equalTo('Alex').on('child_added', ...)
Firebase 엔지니어입니다. Firebase에 데이터를 쓸 때 다양한 애플리케이션 사용 사례를 반영하는 몇 가지 옵션이 있습니다. Firebase는 NoSQL 데이터 저장소이므로 데이터 항목을 고유 한 키로 저장하여 해당 항목에 직접 액세스하거나 특정 위치에서 모든 데이터를로드하고 각 항목을 반복하여 찾고있는 노드를 찾을 수 있습니다. . 자세한 내용은 데이터 쓰기 및 목록 관리 를 참조하십시오.
Firebase에 데이터를 쓸 때 set
고유하고 정의 된 경로 (예 :)를 사용하는 데이터 a/b/c
또는 push
목록에 데이터를 입력하면 고유 한 ID (예 :)가 생성 a/b/<unique-id>
되고 시간별로 해당 목록의 항목을 정렬하고 쿼리 할 수 있습니다 . 위에서 본 고유 ID는 push
의 목록에 항목을 추가하기 위해 호출 하여 생성됩니다 online-b-cards/users
.
push
여기를 사용하는 대신을 사용 set
하고 사용자의 이메일 주소와 같은 고유 키를 사용하여 각 사용자의 데이터를 저장하는 것이 좋습니다 . 그런 다음 online-b-cards/users/<email>
Firebase JS SDK 를 통해 직접 탐색하여 사용자의 데이터에 액세스 할 수 있습니다 . 예를 들면 다음과 같습니다.
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('hello@hello.com'))
myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });
Firebase는 참조에서 특정 문자를 허용하지 않으므로 (참조 생성 참조 ) 위의 코드에서를 제거하고 .
로 대체합니다 ,
.
답변
다음 코드를 통해 세부 정보를 얻을 수 있습니다.
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());
}
답변
가장 좋은 방법은 Firebase에서 제공하는 인증 객체를 기반으로 사용자의 ID를 정의하는 것입니다. 사용자를 만들면 다음을 수행합니다.
FirebaseRef.child('users').child(id).set(userData);
이 아이디는 다음과 같습니다.
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);
});
Firebase 인증 서비스는 항상 모든 제공 업체 중에서 고유 ID를 uid로 설정해야합니다. 이렇게하면 항상 auth.uid를 갖게되며 원하는 사용자에게 쉽게 액세스하여 다음과 같이 업데이트 할 수 있습니다.
FirebaseRef.child('users').child(id).child('name').set('Jon Snow');
답변
자동 생성 된 고유 ID에 액세스하려고 할 때 도움이되는 게시물의 설명입니다. angularFire 암시 적 동기화를 사용하여 ng-repeat 내 Firebase 고유 ID에 액세스
감사합니다. bennlich (출처) :
Firebase는 일반적인 자바 스크립트 객체처럼 작동합니다. 아마도 아래의 예는 올바른 길을 갈 수 있습니다.
<div ng-repeat="(name, user) in users">
<a href="" ng-href="#/{{name}}">{{user.main}}</a>
</div>
편집 : 원하는 결과를 100 % 확신하지는 않지만 ‘aha’순간을 일으킬 수있는 조금 더 있습니다. Firebase 대시 보드에서 액세스하려는 키를 클릭하십시오. 거기에서 다음과 같은 것을 사용할 수 있습니다.
var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
ref.once('value', function(snapshot) {
$scope.variable= snapshot.val();
});
답변
Firebase에서 자동 생성 된 고유 키에 액세스하는 방법 :
데이터 구조 :-OnlineBcards-UniqueKey
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);
});
답변
가장 간단한 방법은 .push(){}
그 임의의 키를 생성하는 함수. 그러나 .update(){}
임의의 키 대신 자식 이름을 지정할 수 있는 기능을 대신 사용하십시오 .
답변
데이터 검색 :
데이터베이스에서을 사용하여 생성 된 임의의 ID를 사용하고 push()
있으므로 데이터를 검색하려면 다음을 수행하십시오.
Android 앱에서 Firebase 사용 :
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
String name=datas.child("name").getValue().toString();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
자바 스크립트에서 Firebase 사용 :
firebase.database().ref().child("users").on('value', function (snapshot) {
snapshot.forEach(function(childSnapshot) {
var name=childSnapshot.val().name;
});
});
여기에 스냅 샷 (데이터 위치)이 users
있고 모든 임의의 ID 내부를 반복하고 이름을 검색하십시오.
특정 사용자에 대한 데이터 검색 :
이제 특정 사용자에 대한 정보 만 검색하려면 쿼리를 추가해야합니다.
Android 앱에서 Firebase 사용 :
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
Query queries=ref.orderByChild("name").equalTo("Alex");
queries.addListenerForSingleValueEvent(new ValueEventListener() {...}
Javascript와 함께 Firebase 사용
firebase.database().ref().child("users").orderByChild("name").equalTo("Alex").on('value', function (snapshot) {
snapshot.forEach(function(childSnapshot) {
var name=childSnapshot.val().name;
});
});
사용 orderByChild("name").equalTo("Alex")
은 말하는 것과 비슷 where name="Alex"
하므로 Alex와 관련된 데이터를 검색합니다.
가장 좋은 방법은:
가장 좋은 방법은 Firebase 인증을 사용하여 각 사용자에 대해 고유 한 ID를 생성하고 임의의 ID 대신이를 사용하는 것입니다. push()
이렇게하면 ID가 있으므로 쉽게 액세스 할 수 있으므로 모든 사용자를 반복 할 필요가 없습니다.
먼저 사용자가 로그인해야하며 고유 ID를 검색하고 리스너를 연결하여 해당 사용자의 다른 데이터를 검색 할 수 있습니다.
Android에서 Firebase 사용하기 :
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
String uid = FirebaseAuthentication.getInstance().getCurrentUser().getUid();
ref.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name=dataSnapshot.child("name").getValue().toString();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Javascript와 함께 Firebase 사용 :
var user = firebase.auth().currentUser;
var uid=user.uid;
firebase.database().ref().child("users").child(uid).on('value', function (snapshot) {
var name=snapshot.val().name;
});