Firebase를 사용하여 이름 속성으로 사용자 확보


129

특정 사용자 계정에서 데이터를 가져 오거나 설정할 수있는 애플리케이션을 만들려고하는데 Firebase의 유혹을 받았습니다.

내가 겪고있는 문제는 내 구조가 다음과 같이 보일 때 특정 사용자 데이터를 타겟팅하는 방법을 모른다는 것입니다.

내 데이터 구조는 아래 텍스트로 설명됩니다.

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

주위를 둘러 보았으며 ID로 임의의 해시가 주어지면 개별 데이터에 액세스하는 방법에 대해서는 실제로 아무것도 찾을 수 없습니다.

이름을 기준으로 개별 사용자 정보를 가져 오려면 어떻게해야합니까? 더 좋은 방법이 있다면 알려주세요!


이것을 시도하십시오 : stackoverflow.com/questions/32886546/…
ugali soft

답변:


156

이전에는 Firebase에서 자체 속성 을 생성 하거나 특정 위치에서 모든 데이터를 다운로드하여 일부 하위 속성 (예 :의 모든 사용자)과 일치하는 요소를 찾고 검색해야했습니다 name === "Alex".

2014 년 10 월 Firebase는이 orderByChild()방법을 통해 새로운 쿼리 기능을 출시하여 이러한 유형의 쿼리를 빠르고 효율적으로 수행 할 수 있습니다. 아래의 업데이트 된 답변을 참조하십시오.


Firebase에 데이터를 쓸 때 다양한 사용 사례를 반영하는 몇 가지 옵션이 있습니다. Firebase는 기본적으로 트리 구조의 NoSQL 데이터 저장소이며 데이터 목록 관리를위한 몇 가지 간단한 기본 요소를 제공합니다.

  1. 고유하고 알려진 키를 사용하여 Firebase에 씁니다 .

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  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', ...)
    

를 추가 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는 참조에서 특정 문자를 허용하지 않으므로 (참조 생성 참조 ) 위의 코드에서를 제거하고 .로 대체합니다 ,.


1
@RobDiMarco Stephen 님이 다음에 올린 질문에 대한 답변이 있습니까?
Charles Han

2
안녕하세요 @RobDiMarco. 이메일 주소를 ID의 기초로 사용하라는 제안은 여전히 ​​유효하지만 새 orderByChild기능 을 가리 키도록 답변을 확장하는 것이 좋습니다. 이 답변이 관련 / 관련 답변으로 자주 표시되는 경우 사람들은 답변을보고 새로운 쿼리 기능을 알고 있어야합니다.
Frank van Puffelen

1
@FrankvanPuffelen 좋은 아이디어-메모 주셔서 감사합니다. 오늘 업데이트하겠습니다.
Rob DiMarco

1
@Ced 불행히도, 나는 작품의 내용에 대해 언급 할 수 없습니다. 나는 우리가 열심히 일하고 있다고 약속하지만 (항상 사실임), 구체적으로는 말할 수 없습니다. 데이터베이스 API는 실제로 어떤 방식으로 제한적이며, 특정 수준의 성능을 보장 할 수있는 메소드 만 노출하기 위해 의도적으로이를 수행합니다. 그렇기 때문에 예를 들어 전체 목록에 대해 작업을 실행하는 메서드를 공개하지 않는 이유가 여기에 있습니다. 고급 사용자를위한 문서에 대한 유용한 정보. 확실하지 않은 경우 Google 그룹에서 자세한 대화를 확인하십시오. groups.google.com/forum/#!forum/firebase-talk 팀은 매우 활발합니다!
Rob DiMarco

1
@RobDiMarco 잘 들었습니다. 나는 어제 Firebase 기능을 보았고 Firebase가 게임 체인저이며 백엔드에 혁명을 일으킬 것이라고 생각했기 때문에 하루 종일 찬성했습니다. 진심으로, 나는 자신의 인생에서 코딩을 해본 적이없는 사람에게 Firebase의 백엔드를 유지하도록 가르 칠 수있었습니다. 꽤 놀랍고 무섭습니다. 건배
Ced

5

다음 코드를 통해 세부 정보를 얻을 수 있습니다.

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()); 
                    }

4

가장 좋은 방법은 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');

2

자동 생성 된 고유 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();
});

앤서니, REST 구조 (?)를 보호하는 정보에 대해 감사하며 분명히 'aha'를 쳤다. 이 게시물을 다시 살펴보면 팁에 감사하기 때문에 데이터를 조금 어색한 방식으로 구조화 했으므로 다음 Firebase 기반 프로젝트를 염두에 두어야합니다.
Richard Bamford 2016 년

2

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);
});

1

가장 간단한 방법은 .push(){}

그 임의의 키를 생성하는 함수. 그러나 .update(){}임의의 키 대신 자식 이름을 지정할 수 있는 기능을 대신 사용하십시오 .


1

데이터 검색 :

데이터베이스에서을 사용하여 생성 된 임의의 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;
   });
 

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
그것은 질문을 다루지 않습니다. 문제는 특정 사용자 계정에서 데이터를 가져오고 설정하는 방법이었습니다. 코드가 사용자 계정을 생성하고 실제로 는 사용자 가 유효한 매개 변수가 아니기 때문에 .setValue (user) 할 수 없으므로 유효하지 않습니다.
Jay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.